<?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: Ratnesh Saxena</title>
    <description>The latest articles on DEV Community by Ratnesh Saxena (@ratnesh_saxena).</description>
    <link>https://dev.to/ratnesh_saxena</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%2F4165691%2Ffdb075c1-af37-40b8-bf01-339a183d727e.jpg</url>
      <title>DEV Community: Ratnesh Saxena</title>
      <link>https://dev.to/ratnesh_saxena</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ratnesh_saxena"/>
    <language>en</language>
    <item>
      <title>I Built a Benchmark That Catches AI Models Cheating (And They All Failed)</title>
      <dc:creator>Ratnesh Saxena</dc:creator>
      <pubDate>Sun, 11 Oct 2026 00:01:41 +0000</pubDate>
      <link>https://dev.to/ratnesh_saxena/i-built-a-benchmark-that-catches-ai-models-cheating-and-they-all-failed-1nbp</link>
      <guid>https://dev.to/ratnesh_saxena/i-built-a-benchmark-that-catches-ai-models-cheating-and-they-all-failed-1nbp</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Benchmark That Catches AI Models Cheating (And They All Failed)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What task did you run?
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;TwinBench&lt;/strong&gt;, a benchmark that tests whether AI agents actually follow rules or just pattern-match their way to plausible-looking answers.&lt;/p&gt;

&lt;p&gt;Here's the trick: every test item comes as a &lt;strong&gt;twin pair&lt;/strong&gt;. Two stimuli that are identical except for one single controlling field. A model only gets credit if it answers &lt;em&gt;both&lt;/em&gt; twins correctly. If it's just pattern-matching surface features, the twins will trip it up because the surface looks the same but the correct answer flips.&lt;/p&gt;

&lt;p&gt;The benchmark covers three areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Counterfactual Rulebooks&lt;/strong&gt; (10 pairs): Config precedence, merge-queue ordering, timezone-aware batching, money rounding, journal replay, version ordering, authority resolution, retry gating. The kind of stuff that breaks production systems when agents get it wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global Consistency Audits&lt;/strong&gt; (10 pairs): Deployment provenance, event replay, snapshot lineage, change-freeze scoring, release shippability. Cross-referencing multiple sources of truth and finding contradictions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Temporal Reconciliation&lt;/strong&gt; (6 pairs): Quota replays, FX cutovers, VOID cascades, DST payroll calculations, schema migration corrections. Time is hard, and agents need to handle it precisely.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each pair uses a strict exact-match scorer. No partial credit. No "close enough." You either followed the rules correctly on both twins or you didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which models did you run it against?
&lt;/h2&gt;

&lt;p&gt;Three frontier models, five runs each per pair:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opus 5.5 Beta&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grok 4.6&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-6.1 Sol&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I picked these three because they're the current top-tier reasoning models, and if any of them can handle precise rule-following under counterfactual pressure, it should be them.&lt;/p&gt;

&lt;p&gt;The filtering protocol: a pair is &lt;strong&gt;retained&lt;/strong&gt; (kept as a real benchmark item) only if at least one model fails at least 2 out of 5 runs. A run only passes if &lt;em&gt;both&lt;/em&gt; twins get full credit. This ensures every item in the final benchmark is genuinely hard, not just hard for one model on a bad day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the main insights?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Four pairs survived. All of them are brutal.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pair&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Opus&lt;/th&gt;
&lt;th&gt;Grok&lt;/th&gt;
&lt;th&gt;Sol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CR-N3&lt;/td&gt;
&lt;td&gt;Timezone batching (DST vs fixed offset)&lt;/td&gt;
&lt;td&gt;4/5 fail&lt;/td&gt;
&lt;td&gt;4/5 fail&lt;/td&gt;
&lt;td&gt;4/5 fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CR-N5&lt;/td&gt;
&lt;td&gt;Journal replay with ABORT semantics&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CR-N6&lt;/td&gt;
&lt;td&gt;Version ordering (rc &amp;gt; release)&lt;/td&gt;
&lt;td&gt;4/5 fail&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;td&gt;4/5 fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CR-N8&lt;/td&gt;
&lt;td&gt;Retry gating on idempotency registration&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;td&gt;5/5 fail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CR-N5 and CR-N8: &lt;strong&gt;every model failed every single run&lt;/strong&gt;. That's 30 consecutive failures across three different frontier models. These aren't edge cases, they're systematic blind spots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised me most:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The models are confident and wrong.&lt;/strong&gt; They don't hedge or express uncertainty. They produce well-formatted, detailed answers that are just... incorrect. The formatting is perfect, the reasoning sounds plausible, but they missed the actual rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Twin pairs expose the cheating.&lt;/strong&gt; On several items, a model would get twin A right and twin B wrong (or vice versa). If you're actually following the rule, the flip shouldn't matter. The fact that it does proves the model is pattern-matching, not reasoning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shortcut baselines score zero.&lt;/strong&gt; I built naive heuristic solvers (ignore timezone conversion, skip ABORT logic, always say "eligible"). They got 0/10 on every retained pair. This confirms the items can't be gamed with surface tricks, you actually need to do the work.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I'd measure next:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More models&lt;/strong&gt;: I'd love to test Gemini, Claude Sonnet, and open-weight models to see if the failure patterns are universal or architecture-specific.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain-of-thought analysis&lt;/strong&gt;: Where exactly does the reasoning break down? Is it misreading the rule, misapplying it, or losing track across the twin?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The dropped pairs&lt;/strong&gt;: Six CR pairs were too easy (models got 4-5/5 right). Are they easy because the mechanism is simple, or because the distractors weren't strong enough?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where can we see it?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kaggle Writeup&lt;/strong&gt; (full paper): &lt;a href="https://www.kaggle.com/competitions/gemma-4-developer-agent-paper/writeups/twinbench-a-twin-pair-benchmark-for-agentic-rule" rel="noopener noreferrer"&gt;https://www.kaggle.com/competitions/gemma-4-developer-agent-paper/writeups/twinbench-a-twin-pair-benchmark-for-agentic-rule&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repo&lt;/strong&gt; (code): &lt;a href="https://github.com/rsaxena3011/twinbench" rel="noopener noreferrer"&gt;https://github.com/rsaxena3011/twinbench&lt;/a&gt; (private during competition judging, will open after)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark harness, all 26 pair implementations, the filtering runner, shortcut baselines, and negative controls are all in the repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;Built for the Kaggle Gemma 4 Developer Agent Paper Track. The twin-pair methodology is the core contribution: if your benchmark doesn't have counterfactual twins, you're measuring pattern matching, not reasoning.&lt;/em&gt;
&lt;/h2&gt;

</description>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>llm</category>
      <category>benchmarking</category>
    </item>
    <item>
      <title>I set filmmaker traps for AI "directors." The models fell for one. My rubric fell for three.</title>
      <dc:creator>Ratnesh Saxena</dc:creator>
      <pubDate>Fri, 09 Oct 2026 22:06:55 +0000</pubDate>
      <link>https://dev.to/ratnesh_saxena/i-set-filmmaker-traps-for-ai-directors-the-models-fell-for-one-my-rubric-fell-for-three-36op</link>
      <guid>https://dev.to/ratnesh_saxena/i-set-filmmaker-traps-for-ai-directors-the-models-fell-for-one-my-rubric-fell-for-three-36op</guid>
      <description>&lt;h1&gt;
  
  
  I set filmmaker traps for AI "directors." The models fell for one. My rubric fell for three.
&lt;/h1&gt;

&lt;p&gt;I QC frames for photorealism and anatomy before anything becomes video. I regenerate bad frames; I do not argue with them. I also direct: corporate events, mythology films, horror shorts, stock shoots.&lt;/p&gt;

&lt;p&gt;If AI models are going to help on a real set, "usually right" is not good enough. The bar is three things: never invent a defect, show your constraints, and write prompts as if a human crew will read them. The benchmarks I have read do not measure those jobs. So I built DirectorBench: adversarial tasks for AI models doing a video director's work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Three tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PromptCraft: write a generation-ready prompt.&lt;/li&gt;
&lt;li&gt;ShotList: plan shots from a brief with hard constraints.&lt;/li&gt;
&lt;li&gt;QC Judge: accept or reject a frame. Some frames are decoys: correct on purpose, and must be passed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a lean pilot: 24 adversarial items, two models (Anthropic Opus 5.5, Grok 4.6), both at Medium effort via Notion AI. Scoring is deterministic: regex checks plus word-overlap checks, no human judgment. Runs happened in Notion AI; the Kaggle benchmark tasks were stuck in the build queue.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Opus 5.5&lt;/th&gt;
&lt;th&gt;Grok 4.6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PromptCraft (6)&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;0.931&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ShotList (6)&lt;/td&gt;
&lt;td&gt;0.810&lt;/td&gt;
&lt;td&gt;0.780&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QC Judge (12)&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;0.917&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Opus 5.5 scored higher on all three. Do not over-read that. On six-item tasks a single item is a large swing, and as you are about to see, two of the three tasks were partly measuring my keyword scorer. The useful question is not which model scored higher. It is what each lost point actually means.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I will not claim
&lt;/h2&gt;

&lt;p&gt;24 items, not the planned 70. Two models, not six. Medium effort, not max. Notion AI, not a clean API harness. One run per item, no variance data.&lt;/p&gt;

&lt;p&gt;Two of the three findings below are as much about my rubric as about the models. I would rather say that here than have someone discover it in the comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 1: the paranoid judge (the trap worked)
&lt;/h2&gt;

&lt;p&gt;The QC task judges written descriptions of frames, not pixels. That is a real limitation; the full run needs actual images. Within that limit, the design is: 6 decoy descriptions that are correct by design and must be passed, plus 6 with genuine defects.&lt;/p&gt;

&lt;p&gt;Opus passed all 6 decoys with the exact right codes. Zero false alarms, zero misses.&lt;/p&gt;

&lt;p&gt;Grok caught all 6 real defects, then rejected a decoy: "the discus spins upright, balanced on the tip of his raised index finger." It marked it FAIL [PHYS].&lt;/p&gt;

&lt;p&gt;That discus is the Sudarshana Chakra. The scene is iconography, and the instructions explicitly exempt iconography from physics review. I cannot see inside the model, so I will not claim to know why. What I can observe is that it applied a physics objection where the written instructions said not to.&lt;/p&gt;

&lt;p&gt;One false alarm in six decoys is a single data point, not a personality. But it is exactly the failure the decoys exist to catch, and the one that matters most in my workflow. A rejection sends a usable frame back into regeneration. A judge that invents defects burns trust: once it flags something that is not wrong, I have to recheck its judgments myself.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;0 false alarms&lt;/th&gt;
&lt;th&gt;1+ false alarms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 misses&lt;/td&gt;
&lt;td&gt;Opus 5.5: useful&lt;/td&gt;
&lt;td&gt;Grok 4.6: paranoid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1+ misses&lt;/td&gt;
&lt;td&gt;lenient&lt;/td&gt;
&lt;td&gt;useless&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the only finding in the pilot that is about a director's job rather than about my scorer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings 2 and 3: where my rubric got trapped
&lt;/h2&gt;

&lt;p&gt;ShotList is where both models scored lowest, and most of the damage came from my own checks. Each task score is the mean of six items; each item is the mean of six sub-checks. Here is where the points actually went.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naming the exclusion gets punished.&lt;/strong&gt; Both models lost about 14 points of ShotList score, roughly two-thirds of everything they lost, on a single sub-check: &lt;code&gt;f_clean&lt;/code&gt;. Five of six items per model tripped it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opus: "no visible logo or markings" flagged for the word "logo"&lt;/li&gt;
&lt;li&gt;Opus: "plain dial with no numbers" flagged for "dial," the brief's own word&lt;/li&gt;
&lt;li&gt;Grok: "no signage, no readable marks" flagged for "signage"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grok slipped past it once: "blank cream pages, no writing, no print." That dodged the trigger word; it is not evidence of a better shot list.&lt;/p&gt;

&lt;p&gt;The models did the right directing thing: state the constraint so the crew can see it. The checker reads the mention as the violation. That is a rubric edge, not a model failure. If your eval rewards silence over clarity, you will select for models that hide their constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Natural phrasing gets punished.&lt;/strong&gt; In PromptCraft, Grok wrote "moonlight" and "moonlit" instead of "moon," and "candlelight" instead of "candle." The noun scorer wanted a whole-word match on "moon"; "moonlight" does not count. Opus wrote the bare nouns and went 6 for 6.&lt;/p&gt;

&lt;p&gt;That does not prove Opus wrote better prompts. It proves this slice of the score measured lexical form, not prompt quality. When a benchmark tells you a model writes bad prompts, check whether it is grading craft or grep patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paraphrase scores zero.&lt;/strong&gt; The b04 ShotList item carried a brand promise: the call is heard but never printed. Both models landed the intent in my reading. Opus wrote "coach calls out in Hindi, stopwatch face turned away." Grok wrote "Split is heard, not seen." The word-overlap sub-check scored both 0.0; it cannot see paraphrase. Those zeros sit inside the ShotList averages in the table above.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The full run is 70 items and six models, with two fixes this pilot earned: compliance scored by meaning instead of keyword presence, and QC judged on actual frames instead of descriptions. The test of DirectorBench is whether it can tell a model that breaks a rule from one that explains it, and a model that invents a defect from one that knows when the rules do not apply.&lt;/p&gt;

&lt;p&gt;A benchmark should distinguish a bad answer from a good answer expressed differently. This pilot showed me where mine does not.&lt;/p&gt;

&lt;p&gt;Items, answer keys, scorers: &lt;a href="https://github.com/rsaxena3011/directorbench" rel="noopener noreferrer"&gt;https://github.com/rsaxena3011/directorbench&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Sthala: an offline audio walk that only speaks when you're standing in the story</title>
      <dc:creator>Ratnesh Saxena</dc:creator>
      <pubDate>Thu, 08 Oct 2026 19:33:06 +0000</pubDate>
      <link>https://dev.to/ratnesh_saxena/sthala-an-offline-audio-walk-that-only-speaks-when-youre-standing-in-the-story-49fl</link>
      <guid>https://dev.to/ratnesh_saxena/sthala-an-offline-audio-walk-that-only-speaks-when-youre-standing-in-the-story-49fl</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sthala: an offline audio walk that only speaks when you're standing in the story
&lt;/h1&gt;

&lt;p&gt;Walk within 35 metres of Banganga Tank and your pocket starts telling you its legend. Walk away and it stops, mid-sentence if it has to.&lt;/p&gt;

&lt;p&gt;I make mythology videos for a living. The audio walks I tried were either generic tours read by a bored narrator or cloud apps that bill Hindi by the character. So I built Sthala (स्थल, "place"): an open-source audio storyteller that turns OpenStreetMap and Wikipedia into short Hindi or English stories, each locked to the spot it describes. Your phone stays in your pocket. The city does the talking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why getting it right matters
&lt;/h2&gt;

&lt;p&gt;A garbled legend playing at a temple isn't a bug. It's an insult to the people who pray there. That idea drives every choice below: stories are written ahead of time, checked line by line against their sources, read by a human, then frozen. The script you hear this year is the script you hear next year. No silent model update gets to rewrite a legend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it feels like
&lt;/h2&gt;

&lt;p&gt;Tap once. Pocket the phone. Screens off, eyes up.&lt;/p&gt;

&lt;p&gt;A ghungroo chime speeds up as you near the next stop. Cross the 35-metre line and the story begins. Stay, and it goes deeper: history, then legend, then the detail everyone walks past. Leave, and it stops. Outside a zone, silence.&lt;/p&gt;

&lt;p&gt;Every story ends with a small task: look at this, count that, notice something. That's my take on Touch Grass. The app's job is to make you pay attention to the place, not the app.&lt;/p&gt;

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

&lt;p&gt;A 76-second run on a simulated GPS trail, driven by the same walk.py the phone runs: approach chime, zone entry, layers deepening, walk-away cutoff. This tests the mechanic, not real-world GPS reliability. A live walk is still pending. The video is in the repo.&lt;/p&gt;

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

&lt;p&gt;Repo: &lt;a href="https://github.com/rsaxena3011/sthala" rel="noopener noreferrer"&gt;https://github.com/rsaxena3011/sthala&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Mumbai pack ships with it: all 18 MP3s, scripts, source text, and the full skeptic log. You can see exactly what the model wrote and what got cut.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The heavy lifting happens on my PC before anyone walks. The phone only does GPS and playback, so it runs offline with no API keys and no per-character fees.&lt;/p&gt;

&lt;p&gt;harvest.py pulls places from OpenStreetMap and article text from Wikipedia. write.py drafts layered stories with Gemma 3 4B, running locally via Ollama, then runs the skeptic pass. voice.py voices them with Meta MMS-TTS, local, open weights. walk.py runs on Android through Termux and termux-api.&lt;/p&gt;

&lt;p&gt;Mumbai is three stops, three layers, two languages: 18 tracks. Sewri Fort (its history, the flamingo season off Sewri jetty), Banganga Tank (its legend and rituals), and Walkeshwar Temple (its story and architecture).&lt;/p&gt;

&lt;h2&gt;
  
  
  The skeptic pass
&lt;/h2&gt;

&lt;p&gt;This is the part I'm proudest of. For Mumbai, Gemma drafted 169 lines. A second pass, holding only the source article, had to defend every line against that text. It deleted 18. Each deletion is logged with its reason in skeptic_log.json.&lt;/p&gt;

&lt;p&gt;Cut: "The fort's construction followed relentless attacks by the Siddis, African sailors allied with the Mughals, who viewed the British as enemies. [History]"&lt;/p&gt;

&lt;p&gt;Gemma tagged that [History] with total confidence. The source never says it. That doesn't make it false, but a confident tag isn't evidence, so it went.&lt;/p&gt;

&lt;p&gt;Survived: "This ancient Hindu temple, dedicated to Lord Shiva, was originally built in 1127 AD by Lakshman Prabhu, a minister of the Silhara dynasty. [History]"&lt;/p&gt;

&lt;p&gt;The Wikipedia text supports it, so it stayed. The skeptic checks that a line matches its source, not that the source is right.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can't do yet
&lt;/h2&gt;

&lt;p&gt;The skeptic is the same Gemma model checking its own draft. It catches confident inventions. It is not an independent fact-checker.&lt;/p&gt;

&lt;p&gt;So the real last gate is me. I read every line the skeptic keeps before a pack ships. That works for three stops. It won't work for a whole city without more reviewers.&lt;/p&gt;

&lt;p&gt;And the demo uses simulated GPS. It proves the mechanic, not real-world GPS reliability. A live walk is next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;For this project, open isn't a preference. It's what makes the project possible.&lt;/p&gt;

&lt;p&gt;Stories that can't drift. Versioned packs play saved audio, so a story sounds the same on every visit. With a hosted model, someone else decides when your legend changes.&lt;/p&gt;

&lt;p&gt;Work you can audit. Every draft, deletion and reason is public. You can't publish a black box's judgement. You can publish a log.&lt;/p&gt;

&lt;p&gt;Hindi without a meter running. With cloud voices, a library of Hindi walks becomes a monthly bill. With open models, it's an overnight job on a home PC.&lt;/p&gt;

&lt;p&gt;Places I'll never reach. Anyone can fork this and build a walk for their own temple, market or lane, in their own language, without asking me or paying anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make a pack for your street
&lt;/h2&gt;

&lt;p&gt;Try the demo:&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/rsaxena3011/sthala
&lt;span class="nb"&gt;cd &lt;/span&gt;sthala
python walk.py &lt;span class="nt"&gt;--demo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building a pack is a heavier job: harvest, write, voice, all local, roughly overnight on a PC. Two ways to help this Hacktoberfest:&lt;/p&gt;

&lt;p&gt;Open an issue proposing three stops near you and their sources.&lt;br&gt;
Send a correction to the Mumbai pack. If a line is wrong, I want to know.&lt;/p&gt;

&lt;p&gt;PRs welcome under packs/.&lt;/p&gt;

&lt;p&gt;Then go outside and let the street talk.&lt;/p&gt;

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