<?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: Vedant Mahajan</title>
    <description>The latest articles on DEV Community by Vedant Mahajan (@vedant817).</description>
    <link>https://dev.to/vedant817</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%2F1027500%2Ff3c1d5d1-b328-4cf2-b297-37eeeb2ec1d3.jpeg</url>
      <title>DEV Community: Vedant Mahajan</title>
      <link>https://dev.to/vedant817</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vedant817"/>
    <language>en</language>
    <item>
      <title>Baahar: I built an agent whose success metric is leaving the house</title>
      <dc:creator>Vedant Mahajan</dc:creator>
      <pubDate>Sat, 10 Oct 2026 06:37:54 +0000</pubDate>
      <link>https://dev.to/vedant817/baahar-i-built-an-agent-whose-success-metric-is-leaving-the-house-2km1</link>
      <guid>https://dev.to/vedant817/baahar-i-built-an-agent-whose-success-metric-is-leaving-the-house-2km1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Baahar&lt;/strong&gt; (बाहर — &lt;em&gt;outside&lt;/em&gt;) finds Bengaluru's &lt;strong&gt;next safe outdoor hour&lt;/strong&gt; from air quality, heat and rain, speaks a ~30-second park briefing, then &lt;strong&gt;turns the screen off&lt;/strong&gt; so you actually go.&lt;/p&gt;

&lt;p&gt;There is no feed, no streak, no badge. The only metric that matters is whether you stood up.&lt;/p&gt;

&lt;p&gt;It is 2am. I open a weather app: 38°C. I open a map: the air is fine. I open a third: stay inside. Fifteen minutes later I have resolved a question that should have taken twenty seconds, and I have not left the desk.&lt;/p&gt;

&lt;p&gt;Fifteen minutes is the problem. Not the weather app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run baahar brief
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  WAIT  Next GO hour is 06:00.

  time   call  comfort  NAQI   feels  why
  19:00  WAIT       75   118  26/26°  Night-time. Air is moderate, but park gates may be
                                    shut.
  20:00  WAIT       76   116  26/26°  Night-time. Air is moderate, but park gates may be
                                    shut.
  06:00  GO         88    63  20/23°  NAQI 63, feels like 23 C.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a briefing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;WAIT. Hold off on the walk. Indian NAQI is 118, in the moderate band. The chance of rain is 1%. It is night; park gates may be closed. A later forecast must be checked before making another plan. The next hour to recheck is 06:00. Refresh conditions before walking. Breathing discomfort for people with lung, asthma or heart conditions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the live Bengaluru hour I recorded. Pocket Mode stays off until the &lt;strong&gt;current&lt;/strong&gt; hour is GO. The stills below are a GO hour so you can see the near-black screen; the video in Demo is this WAIT hour.&lt;/p&gt;

&lt;p&gt;Tap &lt;strong&gt;Pocket the phone&lt;/strong&gt;. Near-black. One instruction. A timer. You cannot scroll.&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%2F3p5v08l26rvfu96yfn90.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%2F3p5v08l26rvfu96yfn90.png" alt="Baahar briefing" width="800" height="1734"&gt;&lt;/a&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%2Fbmy45ym0nkfp7byep9ud.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%2Fbmy45ym0nkfp7byep9ud.png" alt="Pocket Mode" width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open-Meteo gives you &lt;strong&gt;US EPA AQI&lt;/strong&gt;. India has its own index. Baahar recomputes &lt;strong&gt;Indian NAQI&lt;/strong&gt; from raw pollutant concentrations using CPCB 2014 sub-index breakpoints. The overall index is the &lt;strong&gt;worst&lt;/strong&gt; sub-index, not an average.&lt;/p&gt;

&lt;p&gt;The caveat is on every result, because hiding it would make the number quietly wrong:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CPCB breakpoints are defined on 24-hour mean concentrations. Open-Meteo publishes hourly values. Baahar's number is an approximation of official NAQI, not official NAQI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A related bug only tests caught: CPCB expresses CO in mg/m³ and Open-Meteo reports µg/m³. Without a ÷1000, a plausible 2,000 µg/m³ saturates the index at 500.&lt;/p&gt;

&lt;p&gt;Pocket Mode can suggest a species from &lt;a href="https://inaturalist.org" rel="noopener noreferrer"&gt;iNaturalist&lt;/a&gt; &lt;strong&gt;research-grade&lt;/strong&gt; records within 5 km of Bengaluru for the current month. The instruction stays short. The evidence sits underneath:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Look for a Chocolate Pansy.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;iNaturalist research grade: around a dozen recorded within 5 km of Bengaluru this month. A record means someone logged it nearby, not that you will see it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The briefing writer never sees that cue. An LLM asked to "include this" will happily rewrite "around a dozen records" as "keep an eye out for the pansies." The fix is removing the temptation, not a better prompt.&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%2Fs7g14ftnmm3pve2ffdkj.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%2Fs7g14ftnmm3pve2ffdkj.png" alt="Seasonal cue with evidence" width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Two environments, same binary. Judges can clone and run both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Bengaluru (this laptop, Open-Meteo, no key).&lt;/strong&gt;&lt;br&gt;
On 2026-10-10 IST the current hour was WAIT. Next GO hour 06:00. Pocket Mode stayed off. That is the product: it will not start a walk after dark, even though 06:00 in the table is GO.&lt;/p&gt;

&lt;p&gt;Recorded screen demo (captions on the page): &lt;a href="https://github.com/Vedant817/baahar/blob/main/docs/media/demo-brief-wait.mp4" rel="noopener noreferrer"&gt;demo-brief-wait.mp4&lt;/a&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%2Fzpp3mamyp5ix6bl1ksuj.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%2Fzpp3mamyp5ix6bl1ksuj.png" alt="Live WAIT briefing" width="800" height="500"&gt;&lt;/a&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%2Fuxkr0k9998w16s6owk84.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%2Fuxkr0k9998w16s6owk84.png" alt="Pocket Mode blocked until GO" width="800" height="500"&gt;&lt;/a&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/Vedant817/baahar.git
&lt;span class="nb"&gt;cd &lt;/span&gt;baahar
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--group&lt;/span&gt; dev
uv run baahar brief &lt;span class="nt"&gt;--city&lt;/span&gt; Bengaluru
uv run baahar serve    &lt;span class="c"&gt;# http://127.0.0.1:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recorded fixtures (what CI runs).&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;BAAHAR_OFFLINE=1&lt;/code&gt; replays committed Open-Meteo samples so the suite does not depend on tonight's air. 734 tests pass offline. The layout audit hits the live UI when GitHub Actions can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outdoor walk.&lt;/strong&gt;&lt;br&gt;
Not done. &lt;code&gt;docs/FIELD_TEST.md&lt;/code&gt; is a blank form. The after-walk journal is wired (&lt;code&gt;uv run baahar journal --markdown&lt;/code&gt;) and will paste here when a human fills it. The theme's bonus is "take it outside"; the required demo is a working project and this write-up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adversarial pass (personas, not a park).&lt;/strong&gt;&lt;br&gt;
Four scripted users ran the real CLI/UI and found copy that lied: a WAIT badge that said "Go at 06:00.", "Forecast window 06:00." as a sentence, a journal dump that looked like a completed walk. Those are fixed on &lt;code&gt;main&lt;/code&gt;. That is product testing. It is not a Cubbon Park walk.&lt;/p&gt;

&lt;p&gt;This is not a hosted Render demo. I did not deploy, so I am not claiming that category.&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%2Ffgkh6l4kgu6halquklte.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%2Ffgkh6l4kgu6halquklte.png" alt="After-walk journal" width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/Vedant817/baahar" rel="noopener noreferrer"&gt;github.com/Vedant817/baahar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;First commit: 2026-10-06 (inside the challenge window)&lt;/li&gt;
&lt;li&gt;License: MIT&lt;/li&gt;
&lt;li&gt;Tests pass offline (&lt;code&gt;uv run pytest&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Every number below: &lt;a href="https://github.com/Vedant817/baahar/blob/main/eval/RESULTS.md" rel="noopener noreferrer"&gt;&lt;code&gt;eval/RESULTS.md&lt;/code&gt;&lt;/a&gt;, raw JSON in &lt;code&gt;eval/raw/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weather.py ──┐
             ├──▶ forecast.py ──▶ features.py ──▶ score.py ──▶ brief.py ──▶ Pocket Mode
air.py ──────┘   (join on        (28 tabular   (shipped       (Gemma /      (near-black,
naqi.py            timestamp)      features)     ensemble,     template)     timer)
(CPCB NAQI)                                     TabPFN, or
                                                heuristic)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three decisions I would defend:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The safety rule is code, not a model output.&lt;/strong&gt; &lt;code&gt;features.py&lt;/code&gt; owns GO/WAIT/SKIP, with every threshold anchored to CPCB category edges. The model predicts a physical NAQI band. The boring, auditable part stays code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety is asymmetric.&lt;/strong&gt; A learned prediction that is &lt;em&gt;less&lt;/em&gt; strict than the policy is discarded. The model may talk you &lt;em&gt;out&lt;/em&gt; of a walk. It may never talk you &lt;em&gt;into&lt;/em&gt; bad air.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety is repaired after generation.&lt;/strong&gt; &lt;code&gt;enforce_safety()&lt;/code&gt; appends a real NAQI figure, strips "guaranteed safe"-style hedging, and if the plan says SKIP but the text sounds encouraging, &lt;strong&gt;throws the text away&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Go / no-go: predict the CPCB band six hours ahead
&lt;/h3&gt;

&lt;p&gt;8,130 hourly rows, Bengaluru, 2025-11-01 → 2026-10-05, Open-Meteo CAMS + ERA5. Chronological holdout, never shuffled: last 20% is 1,626 rows (2026-07-30 → 2026-10-05). 28 features (13 base + 15 lags / diffs / rolling windows).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;model&lt;/th&gt;
&lt;th&gt;accuracy&lt;/th&gt;
&lt;th&gt;macro-F1 (4 bands)&lt;/th&gt;
&lt;th&gt;moderate recall&lt;/th&gt;
&lt;th&gt;skip_as_go&lt;/th&gt;
&lt;th&gt;n(SKIP)&lt;/th&gt;
&lt;th&gt;fit time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;majority class&lt;/td&gt;
&lt;td&gt;0.4047&lt;/td&gt;
&lt;td&gt;0.1441&lt;/td&gt;
&lt;td&gt;0.0000&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&amp;lt;0.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;persistence&lt;/td&gt;
&lt;td&gt;0.3647&lt;/td&gt;
&lt;td&gt;0.2492&lt;/td&gt;
&lt;td&gt;0.2746&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&amp;lt;0.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;logistic regression&lt;/td&gt;
&lt;td&gt;0.7897&lt;/td&gt;
&lt;td&gt;0.5361&lt;/td&gt;
&lt;td&gt;0.4225&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;2.0 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;random forest&lt;/td&gt;
&lt;td&gt;0.8280&lt;/td&gt;
&lt;td&gt;0.5780&lt;/td&gt;
&lt;td&gt;0.5141&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;3.2 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gradient boosting&lt;/td&gt;
&lt;td&gt;0.8567&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.6906&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.4789&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;60.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lightgbm&lt;/td&gt;
&lt;td&gt;0.8594&lt;/td&gt;
&lt;td&gt;0.6347&lt;/td&gt;
&lt;td&gt;0.5000&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;23.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;consensus ensemble (shipped)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.8617&lt;/td&gt;
&lt;td&gt;0.6349&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.6620&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;46.4 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN 9.1.0 (cpu)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.8708&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.6193&lt;/td&gt;
&lt;td&gt;0.5845&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;358 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Accuracy and 4-band macro-F1 are 5-seed means (seeds 0–4). Moderate recall is seed 0. &lt;code&gt;poor&lt;/code&gt; has &lt;strong&gt;n=3&lt;/strong&gt;. Two CPCB bands (&lt;code&gt;severe&lt;/code&gt;, &lt;code&gt;hazardous&lt;/code&gt;) have &lt;strong&gt;zero&lt;/strong&gt; holdout rows. Gradient boosting leads 4-band macro-F1 because it caught 1 of those 3 poor rows; on the three bands with real support the ensemble wins (0.8249 vs TabPFN 0.8236 vs GB 0.7874).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TabPFN is the accuracy leader and is not the engine I ship.&lt;/strong&gt; It loses moderate recall (0.5845 vs 0.6620) — the under-warning direction for outdoor air. It is also ~7.7× slower to fit. The product cares about walking you into moderate air, not about winning raw accuracy.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;+/-&lt;/code&gt; seed spreads are reproducibility across fits on the same split, not statistical significance. Ensemble seed sd is 0.0005; binomial SE at n=1,626 is ~0.009.&lt;/p&gt;

&lt;h3&gt;
  
  
  Briefings: Gemma ran for real, and the template still ships
&lt;/h3&gt;

&lt;p&gt;36 cases, 12/12/12 GO/WAIT/SKIP from archived Bengaluru hours. Judge is &lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt; — not a Gemma model grading its own homework.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;check&lt;/th&gt;
&lt;th&gt;template&lt;/th&gt;
&lt;th&gt;Gemma 4 (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;length ≤ 120 words&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hallucinated park&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cites NAQI&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forbidden terms&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GO park name (n=12)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.833&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blind rubric / 10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.83&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;latency p50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;51,730 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The local writer scored higher, named the park on every GO case, and was ~17,000× faster. Gemma is an optional upgrade (&lt;code&gt;--writer gemma&lt;/code&gt;). Default is the template. That is not the outcome I expected when I wrote the eval.&lt;/p&gt;

&lt;p&gt;The first judge run scored both writers ~3.4/10 because the rubric punished a SKIP briefing for not sounding exciting. A briefing that correctly tells you to stay in is well written. Re-judging the &lt;strong&gt;same 72 briefings&lt;/strong&gt; moved template 3.43 → 9.83 and Gemma 3.33 → 9.53. The harness now refuses a rubric that gives every decision the same score.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I refused to promote
&lt;/h3&gt;

&lt;p&gt;Hosted Qwen LoRAs learned the templates (validation loss 2.88 → 0.018). They still failed a locked synthetic stress gate (missing air-uncertainty caveats). Serving stays the deterministic writer.&lt;/p&gt;

&lt;p&gt;A later ozone TCN on Bapuji Nagar station labels learned typical ozone and missed every Very Poor hour on a held-out April cluster (0/14), same as CAMS. Four train Very Poor hours do not teach a 16-hour spike. I did not ship it.&lt;/p&gt;

&lt;p&gt;Tinker is reachable at &lt;code&gt;tinker.thinkingmachines.dev&lt;/code&gt;. Running it found 29 of 219 fine-tune examples whose &lt;code&gt;decision&lt;/code&gt; label contradicted their own briefing text (night hours: band policy said GO, park gates said WAIT). After the dataset fix, the API returned &lt;strong&gt;HTTP 402&lt;/strong&gt;. I am not claiming the Tinker category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Is it safe to walk?" is a tabular question with a published standard.&lt;/strong&gt; You want an inspectable model and a confusion matrix, not a wellness score that cannot show its mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The safety number is &lt;code&gt;skip_as_go_rate&lt;/code&gt;.&lt;/strong&gt; 94% accurate and walking you out on the three worst air days is worse than useless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tune and swap.&lt;/strong&gt; Gemma, a local template, or a hosted LoRA — the product does not change. The writer is a component.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost is the enabler.&lt;/strong&gt; Open-Meteo is keyless. Gemma's free tier needs no card. That is why a solo first-time builder could ship this in the challenge window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy by default.&lt;/strong&gt; City granularity. No GPS history. No account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open used to reduce screen time.&lt;/strong&gt; The engineering problem was how little screen this can survive on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Related work on this same week: &lt;a href="https://dev.to/khushi886987/clean-air-walk-i-asked-gemma-when-its-safe-to-touch-grass-in-delhi-ncr-and-lost-a-fight-with-my-3dmm"&gt;Clean Air Walk&lt;/a&gt; asks Gemma about Delhi NCR air, and &lt;a href="https://dev.to/sansk_ya/golden-hour-a-go-outside-planner-where-a-small-local-gemma-cannot-invent-numbers-3ol5"&gt;golden-hour&lt;/a&gt; keeps a small Gemma from inventing numbers. Baahar's bet is the same honesty, with CPCB NAQI as code and Pocket Mode as the product.&lt;/p&gt;

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

&lt;p&gt;Listing only what actually ran.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gemma-4-31b-it&lt;/code&gt; generated and evaluated every model briefing (36 cases, machine checks + blind rubric). Open-weight model at the core of the briefing path. I still ship the template as default because it won on park-naming, rubric, and latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of TabPFN
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;tabpfn==9.1.0&lt;/code&gt; ran on the real 1,626-row chronological holdout, 28 features, 5 seeds: &lt;strong&gt;0.8708 accuracy / 0.6193 4-band macro-F1&lt;/strong&gt;. Licence accepted by a human, token in &lt;code&gt;.env&lt;/code&gt;, CPU override documented. I claim the category because it genuinely ran, and I ship the ensemble because moderate recall is the product metric.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not claiming
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tinker&lt;/td&gt;
&lt;td&gt;Dataset built; LoRA blocked by HTTP 402 after a real run found contradictory labels.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;td&gt;Not deployed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElevenLabs&lt;/td&gt;
&lt;td&gt;Client implemented, never called.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino / DigitalOcean / others&lt;/td&gt;
&lt;td&gt;Not used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Baahar is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not a medical device.&lt;/li&gt;
&lt;li&gt;Not a replacement for the official CPCB advisory.&lt;/li&gt;
&lt;li&gt;Outdoor walk not recorded yet. Live Bengaluru scoring and Pocket refusal are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Data:&lt;/strong&gt; Weather and air quality by &lt;a href="https://open-meteo.com/" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt; (CC BY 4.0). Indian NAQI computed with CPCB 2014 breakpoints. Parks from &lt;a href="https://www.openstreetmap.org" rel="noopener noreferrer"&gt;OpenStreetMap&lt;/a&gt; (ODbL). Species cues from iNaturalist research-grade records.&lt;/p&gt;

&lt;p&gt;Built by &lt;a href="https://github.com/Vedant817" rel="noopener noreferrer"&gt;Vedant Mahajan&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>python</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Aaji's Pill Clerk: a prescription copy that asks before it guesses</title>
      <dc:creator>Vedant Mahajan</dc:creator>
      <pubDate>Sun, 04 Oct 2026 14:49:35 +0000</pubDate>
      <link>https://dev.to/vedant817/aajis-pill-clerk-a-prescription-copy-that-asks-before-it-guesses-1ko9</link>
      <guid>https://dev.to/vedant817/aajis-pill-clerk-a-prescription-copy-that-asks-before-it-guesses-1ko9</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;Aaji's Pill Clerk is a prescription-copying tool for my grandparent and the family member who helps manage their medicines. It turns checked prescription text into a large-font fridge chart, calendar reminders and stock-based refill dates.&lt;/p&gt;

&lt;p&gt;The difficult part is getting the copy right. A half tablet, a syrup concentration and a three-day course must survive the move from a slip to a schedule. The app copies written instructions; it never chooses or changes a dose. Anything unclear becomes &lt;strong&gt;ASK&lt;/strong&gt;, and every line needs confirmation before export.&lt;/p&gt;

&lt;p&gt;Scan accepts a local photo as a reference and manual transcription. Optional Windows OCR and local Gemma extraction are available, but handwriting probes made errors, so manual transcription remains the default. Review puts the source beside editable fields. Editing a confirmed line revokes its signoff. Chart produces Marathi, Hindi or English HTML and an &lt;code&gt;.ics&lt;/code&gt; file, with the source and check record included in the copy. The app starts empty.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Vedant817/aaji-pill-clerk/blob/master/artifacts/acceptance/demo.mp4" rel="noopener noreferrer"&gt;Watch the 85-second synthetic MVP demo&lt;/a&gt; or &lt;a href="https://raw.githubusercontent.com/Vedant817/aaji-pill-clerk/master/artifacts/acceptance/demo.mp4" rel="noopener noreferrer"&gt;download the MP4&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This recording uses a clearly marked synthetic slip and shows the earlier working MVP. A fresh check of the final code also uploaded that slip, used live hosted FT2 parsing, confirmed both lines and verified the actual chart and ICS bytes. &lt;a href="https://github.com/Vedant817/aaji-pill-clerk/blob/master/artifacts/acceptance/final/export-verification.json" rel="noopener noreferrer"&gt;Final export evidence&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is no public app deployment. The repository contains local setup instructions.&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/Vedant817" rel="noopener noreferrer"&gt;
        Vedant817
      &lt;/a&gt; / &lt;a href="https://github.com/Vedant817/aaji-pill-clerk" rel="noopener noreferrer"&gt;
        aaji-pill-clerk
      &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;Aaji's Pill Clerk&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local-first clerk that turns photos of a grandparent's handwritten (or printed) prescriptions into a &lt;strong&gt;confirmed&lt;/strong&gt; medicine schedule, a &lt;strong&gt;big-font fridge chart&lt;/strong&gt;, phone reminders (&lt;code&gt;.ics&lt;/code&gt;), and refill dates.&lt;/p&gt;
&lt;p&gt;This is a DEV Hacktoberfest 2026 Weekend Challenge entry ("Build for a Friend").&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Safety&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;It's a clerk, not a clinician.&lt;/strong&gt; It copies what the prescription says into a schedule. It does &lt;strong&gt;not&lt;/strong&gt; suggest doses, check interactions, recommend substitutes, or interpret symptoms. This README and the UI never use the words "advice" or "recommend" about medicine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"ASK" is a feature.&lt;/strong&gt; Uncertain fields go in &lt;code&gt;needs_check&lt;/code&gt; and show as &lt;strong&gt;ASK&lt;/strong&gt; in red. They are never filled with a guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A human signs off on every line.&lt;/strong&gt; The chart cannot be printed until every red cell is resolved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic maths.&lt;/strong&gt; Slot expansion, tapers, durations and refill dates are plain, unit-tested Python, never the LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a medical device.&lt;/strong&gt; 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/Vedant817/aaji-pill-clerk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The code is Apache-2.0. Training examples are synthetic; private prescriptions and public dataset photos stay out of git.&lt;/p&gt;

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

&lt;p&gt;The parser is a fine-tuned &lt;strong&gt;Qwen3-8B&lt;/strong&gt;, trained and served through &lt;strong&gt;Tinker&lt;/strong&gt;. No fine-tuned weights were downloaded, merged or converted on the laptop. Environment switches keep extraction and parsing backends replaceable. Optional local extraction uses &lt;strong&gt;Gemma 4&lt;/strong&gt; through Ollama. Streamlit handles review, SQLite stores checked copies, and deterministic code expands the confirmed schedule and calculates refill dates from entered stock.&lt;/p&gt;

&lt;p&gt;Training more did not automatically make it better. The newest candidate, V6, completed 615 steps, but fresh matched evaluations showed these exact clinical-field counts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Text cohort&lt;/th&gt;
&lt;th&gt;Active FT2&lt;/th&gt;
&lt;th&gt;Candidate V6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Synthetic, 397 lines&lt;/td&gt;
&lt;td&gt;397&lt;/td&gt;
&lt;td&gt;351&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generated notation, 102 lines&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HMR typed text, 104 lines&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;V6 also increased the HMR unflagged danger metric from 17 to 22 cases, so it was rejected. FT2 remains active. These are parser-only measurements, not handwriting accuracy or clinical validation. Exact match excludes ASK fields. The frozen historical labels also assume some units that the new candidate deliberately withholds; the comparison records that policy difference. &lt;a href="https://github.com/Vedant817/aaji-pill-clerk/blob/master/docs/candidate-v6.md" rel="noopener noreferrer"&gt;Training report and paired results&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Earlier saved evaluations showed the few-shot base Qwen3-8B at 53.65% exact on the synthetic set and FT2 at 100%, under that earlier evaluation pipeline. Those historical runs are distinct from the fresh comparison above. &lt;a href="https://github.com/Vedant817/aaji-pill-clerk/blob/master/eval/results.md" rel="noopener noreferrer"&gt;Original results and limitations&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The final suite passed &lt;strong&gt;232 tests&lt;/strong&gt;. Four AI role reviewers checked caregiver, QA, first-time-user and PM scenarios. Their feedback led to fixes for lost written instructions, invalid edits retaining confirmation, and unknown course lengths becoming indefinite reminders. These simulations are labelled as agent tests; they are not human testimonials.&lt;/p&gt;

&lt;p&gt;Google Calendar's actual web file import accepted all four synthetic recurring series. Read-back verified 20 occurrences, IST times, course limits and zero-minute popup reminders. The separate test calendar was then deleted. An Android emulator previously displayed reminders, and the user reported one notification on a physical Android phone for a separate non-medical test. Physical-phone recurrence and audible alarms remain unverified.&lt;/p&gt;

&lt;p&gt;The real caregiver has not yet supplied personal-use feedback. Two independent human annotation rounds are also pending, so OCR CER remains unscored. Those gaps are reported openly; AI reference labels do not fill them.&lt;/p&gt;

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

&lt;p&gt;Open weights let this project specialize a parser, retain an earlier checkpoint when a new one regresses, and swap extraction backends. Open code lets another family inspect the confirmation rules and schedule calculations, adapt the languages, and reproduce the synthetic tests without publishing a private prescription.&lt;/p&gt;

&lt;p&gt;The photo can stay on the laptop. The configured Tinker parser receives medicine text after PII stripping, so the app is not fully offline and stripping is not guaranteed anonymisation. The value of the open approach here is control over the model, copying rules and evidence, including the freedom to reject a training run that looked promising.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tinker:&lt;/strong&gt; hosted task-specific Qwen3-8B fine-tuning, saved baseline comparisons and explicit rejection of regressing candidates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; optional local Gemma 4 photo extraction and documented handwriting probes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Render or DigitalOcean deployment is claimed.&lt;/p&gt;

&lt;p&gt;This post and implementation were prepared with an AI coding agent under the builder's instructions. All reported numbers come from saved runs; no caregiver quote, consent or clinical outcome has been invented.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>PagePilot</title>
      <dc:creator>Vedant Mahajan</dc:creator>
      <pubDate>Sat, 06 Jun 2026 11:45:28 +0000</pubDate>
      <link>https://dev.to/vedant817/pagepilot-538c</link>
      <guid>https://dev.to/vedant817/pagepilot-538c</guid>
      <description>&lt;p&gt;This is a submission for the GitHub Finish-Up-A-Thon Challenge&lt;br&gt;
(&lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;https://dev.to/challenges/github-2026-05-21&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What I Built&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I built PagerPilot, an AI-powered SRE incident investigator that helps on-call engineers move from noisy alerts to an actionable incident brief.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;PagerPilot uses a multi-agent workflow:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Router Agent&lt;/strong&gt; — identifies the affected service and decides which sources to check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Fetch Agent&lt;/strong&gt; — gathers signals from PagerDuty, Datadog, GitHub, and StatusGator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyst Agent&lt;/strong&gt; — correlates incidents, metrics, alerts, deploys, commits, and third-party status signals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reporter Agent&lt;/strong&gt; — generates a structured incident brief with root-cause hypotheses, confidence scores, timeline, blast radius, and recommended actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: reduce the time engineers spend jumping between dashboards during an incident and give them one trusted starting point for triage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Vedant817/PagerPilot" rel="noopener noreferrer"&gt;https://github.com/Vedant817/PagerPilot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can run the project 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/Vedant817/PagerPilot.git
   &lt;span class="nb"&gt;cd &lt;/span&gt;PagerPilot
   pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
   python &lt;span class="nt"&gt;-m&lt;/span&gt; backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Then open:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   http://localhost:8000/ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Useful endpoints:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   GET  /health
   GET  /api/v1/diagnostics
   GET  /api/v1/incidents
   POST /api/v1/investigate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** Example investigation payload:**&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&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;"incident_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INC-001"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  PagerPilot returns a full incident brief, including:
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;executive summary&lt;/li&gt;
&lt;li&gt;evidence timeline&lt;/li&gt;
&lt;li&gt;ranked root-cause hypotheses&lt;/li&gt;
&lt;li&gt;confidence score&lt;/li&gt;
&lt;li&gt;recommended remediation steps&lt;/li&gt;
&lt;li&gt;service impact and blast radius&lt;/li&gt;
&lt;li&gt;session logs from the agent pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Comeback Story&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PagerPilot started as an unfinished incident-investigation prototype. The idea was strong, but the project needed extensive finishing work before it felt reliable.&lt;/p&gt;

&lt;p&gt;Before the final push, the app had several issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing runtime dependencies&lt;/li&gt;
&lt;li&gt;fragile environment parsing&lt;/li&gt;
&lt;li&gt;incomplete connector behaviour&lt;/li&gt;
&lt;li&gt;weak error handling&lt;/li&gt;
&lt;li&gt;frontend rendering bugs&lt;/li&gt;
&lt;li&gt;unsafe dynamic HTML rendering&lt;/li&gt;
&lt;li&gt;inconsistent investigation responses&lt;/li&gt;
&lt;li&gt;evaluation output that failed on some terminals&lt;/li&gt;
&lt;li&gt;runtime configuration that was not production-friendly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I brought the project into a finished state by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hardening the FastAPI backend&lt;/li&gt;
&lt;li&gt;adding diagnostics for connector readiness&lt;/li&gt;
&lt;li&gt;improving session and failure responses&lt;/li&gt;
&lt;li&gt;making the analyst's logic more reliable&lt;/li&gt;
&lt;li&gt;improving timestamp handling and timeline sorting&lt;/li&gt;
&lt;li&gt;strengthening secret redaction&lt;/li&gt;
&lt;li&gt;fixing frontend failure states&lt;/li&gt;
&lt;li&gt;reducing unsafe DOM rendering patterns&lt;/li&gt;
&lt;li&gt;making the evaluation runner portable&lt;/li&gt;
&lt;li&gt;cleaning up config, Docker ignore rules, and runtime startup&lt;/li&gt;
&lt;li&gt;committing changes in separate logical commits instead of one large dump&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final result is a working AI SRE investigator that can run locally, connect to real tools, and serve as a Practical Incident Briefing Assistant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Experience with GitHub Copilot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub Copilot helped speed up the finish line by acting as a pair programmer while I cleaned up the project.&lt;/p&gt;

&lt;p&gt;It was especially useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reasoning through backend failure cases&lt;/li&gt;
&lt;li&gt;improving FastAPI response models&lt;/li&gt;
&lt;li&gt;refactoring repeated config parsing logic&lt;/li&gt;
&lt;li&gt;tightening connector error handling&lt;/li&gt;
&lt;li&gt;improving frontend rendering safety&lt;/li&gt;
&lt;li&gt;writing cleaner validation and smoke-test flows&lt;/li&gt;
&lt;li&gt;organising fixes into focused commits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest value was momentum. Instead of getting stuck on small implementation details, I could keep moving through the backlog: diagnose, patch, test, commit, and repeat.&lt;/p&gt;

&lt;p&gt;PagerPilot feels like the kind of project that benefits from AI assistance twice: first as a coding partner during development, and second as the actual product experience for engineers responding to incidents.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
  </channel>
</rss>
