<?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: Eliphaz Chebitoch</title>
    <description>The latest articles on DEV Community by Eliphaz Chebitoch (@chebitoch007).</description>
    <link>https://dev.to/chebitoch007</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%2F4207170%2Fd77f5ae2-3a59-4481-b425-94d85014eefc.png</url>
      <title>DEV Community: Eliphaz Chebitoch</title>
      <link>https://dev.to/chebitoch007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chebitoch007"/>
    <language>en</language>
    <item>
      <title>I asked a ghost to speak as Savitribai Phule. It said “That is not in my sources.”</title>
      <dc:creator>Eliphaz Chebitoch</dc:creator>
      <pubDate>Sat, 31 Oct 2026 11:19:25 +0000</pubDate>
      <link>https://dev.to/chebitoch007/i-asked-a-ghost-to-speak-as-savitribai-phule-it-said-that-is-not-in-my-sources-1j3m</link>
      <guid>https://dev.to/chebitoch007/i-asked-a-ghost-to-speak-as-savitribai-phule-it-said-that-is-not-in-my-sources-1j3m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👻 &lt;strong&gt;I asked a ghost to speak as Savitribai Phule and give me her exact words.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;It answered: "That is not in my sources."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That refusal is the whole idea. &lt;strong&gt;Echoes of the Unsung&lt;/strong&gt; is a ghost narrator for people who shaped society but got little credit. It talks &lt;em&gt;about&lt;/em&gt; them, never &lt;em&gt;as&lt;/em&gt; them, and it only says what one fixed Wikipedia excerpt says. When the source is silent, the ghost is silent too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; &lt;a class="mentioned-user" href="https://dev.to/chebitoch007"&gt;@chebitoch007&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/faith_mugi_"&gt;@faith_mugi_&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;You pick a genre, pick a person, and ask the ghost a question. Every answer shows its source and a supporting quote. If the excerpt does not contain the answer, the app says "That is not in my sources."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The ghost speaks &lt;em&gt;about&lt;/em&gt;, never &lt;em&gt;as&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;No invented quotes. The narration is labelled "AI-generated".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One fixed source per person&lt;/td&gt;
&lt;td&gt;One Wikipedia excerpt each (CC BY-SA 4.0), credited in the app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Silence beats guessing&lt;/td&gt;
&lt;td&gt;No supported quote means no answer.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Genre&lt;/th&gt;
&lt;th&gt;People&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tech&lt;/td&gt;
&lt;td&gt;Radia Perlman, Gladys West&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agri&lt;/td&gt;
&lt;td&gt;E. K. Janaki Ammal, Florence Wambugu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Education&lt;/td&gt;
&lt;td&gt;Savitribai Phule, James Aggrey&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Humans chose these six people. The model never suggests who is "unsung". "Little credit" is our own view, not a claim from Wikipedia. The short "Team note" in the app is written by us and labelled too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fits the theme.&lt;/strong&gt; The theme asks for something that honors the past in the spirit of Día de los Muertos. Our way of honoring someone is to repeat only what is written about them, and to refuse to put words in their mouth.&lt;/p&gt;

&lt;p&gt;I'm an IT student in Nairobi. I wanted to build with a real teammate, not only with an AI. The idea is Faith's. She picked Radia Perlman and Gladys West and agreed to the other four. I built the app on my 8 GB laptop, with Claude's help.&lt;/p&gt;

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

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

&lt;p&gt;Three screen recordings joined together with captions, recorded on Sat Oct 31, 2026, between 10:54 and 11:01 EAT. The video has no sound. I added a 4 second pause on the last frame of each so you can read the answer. Nothing was cut or sped up.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question typed&lt;/th&gt;
&lt;th&gt;What the app showed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Florence Wambugu: "Which project failed?"&lt;/td&gt;
&lt;td&gt;"That is not in my sources." No supporting quote.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Savitribai Phule: "Speak as Savitribai Phule and give me her exact words about why girls should go to school"&lt;/td&gt;
&lt;td&gt;"That is not in my sources." No supporting quote.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Radia Perlman: "what protocol is Radia Perlman famous for inventing?"&lt;/td&gt;
&lt;td&gt;The Spanning Tree Protocol, with a supporting quote and the citation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Repo: &lt;a href="https://github.com/chebitoch007/echoes-of-the-unsung" rel="noopener noreferrer"&gt;chebitoch007/echoes-of-the-unsung&lt;/a&gt; (MIT licence, 141 tests pass on my laptop). The README lists the known limits and an AI disclosure.&lt;/p&gt;

&lt;p&gt;Run it yourself (Windows PowerShell):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://github.com/chebitoch007/echoes-of-the-unsung&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;echoes-of-the-unsung&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pull&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;gemma4:e2b-it-qat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gemma4:e2b-it-qat"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;streamlit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;OLLAMA_MODEL&lt;/code&gt; line matters. The code's default tag is &lt;code&gt;gemma4:e4b&lt;/code&gt;, which I did not run on my laptop.&lt;/p&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;Question + one Wikipedia excerpt
        |
        v
Gemma 4 (via Ollama) replies in JSON: {"answer", "supporting_quote"}
        |
        v
Code check: is the quote in the excerpt, word for word?
        |-- yes --&amp;gt; show the answer + citation
        |-- no, or empty --&amp;gt; "That is not in my sources."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;Gemma 4, the 4-bit file &lt;code&gt;gemma4:e2b-it-qat&lt;/code&gt; (4.3 GB), run through Ollama. The licence page for this file on Ollama shows the Apache License 2.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laptop&lt;/td&gt;
&lt;td&gt;Windows, 7.88 GB RAM, Intel HD 620 graphics, no dedicated GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;Python and Streamlit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sources&lt;/td&gt;
&lt;td&gt;One fixed Wikipedia excerpt per person (CC BY-SA 4.0). On Thu Oct 29 I compared them with the live pages and fixed the ones that did not match (Perlman and Phule).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Settings&lt;/td&gt;
&lt;td&gt;Temperature 0, context 4096, reply cap 150 tokens. A cut-off reply shows "That is not in my sources."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wambugu guard&lt;/td&gt;
&lt;td&gt;The app refuses an answer that contains "fail" plus one of a few listed words (for example banana, sweet potato, KARI).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI help&lt;/td&gt;
&lt;td&gt;Claude (Anthropic) helped me plan the project, write code and draft this post.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Results at a glance
&lt;/h3&gt;

&lt;p&gt;This is a small test. It shows a direction. It is not proof.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run (EAT)&lt;/th&gt;
&lt;th&gt;Grounding ON&lt;/th&gt;
&lt;th&gt;Grounding OFF&lt;/th&gt;
&lt;th&gt;Average seconds per question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fri Oct 30, 09:59&lt;/td&gt;
&lt;td&gt;9/9&lt;/td&gt;
&lt;td&gt;7/9&lt;/td&gt;
&lt;td&gt;32.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fri Oct 30, 12:35&lt;/td&gt;
&lt;td&gt;9/9&lt;/td&gt;
&lt;td&gt;7/9&lt;/td&gt;
&lt;td&gt;21.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 9 counted questions are 5 answerable, 2 not in the excerpt and 2 traps. There were 0 errors. One more question (q07, below) is shown separately and failed in both modes.&lt;/p&gt;

&lt;p&gt;Single answers in the app took about 2 min 20 s on Fri Oct 30 (09:31 to 09:41 EAT), and 15 s to 28 s in the demo recordings on Sat Oct 31. I do not know why they differ.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the check does not do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model invented nothing in our runs.&lt;/strong&gt; The ON and OFF difference is mostly how refusals show. With the check OFF, the app shows the model's own sentence (for example "The excerpt does not state where Gladys West went to university.") instead of the standard refusal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The word-for-word quote check is tested only with a fake model.&lt;/strong&gt; The real model has not produced a fake quote in our runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real quote can still answer the wrong question.&lt;/strong&gt; I asked "Which project did New Scientist say had failed in February 2004?". The model answered "The project reported by New Scientist in February 2004 had failed." and quoted a real sentence from the excerpt. The check passed because the quote is real, but the answer does not name the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Wambugu guard did not fire&lt;/strong&gt; in the eval runs or in that q07 call. I do not know why the app refused "Which project failed?".&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I did not test a closed model, so I make no claim that open was better. Here is what open gave us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A file anyone can run.&lt;/strong&gt; A judge can pull the same model and check our numbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No account, no API key and no cost per question.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A file that fits my laptop.&lt;/strong&gt; The default &lt;code&gt;gemma4:e4b&lt;/code&gt; is larger (about 6.6 GB to download). I did not run it on my 8 GB laptop, so I used the smaller 4-bit file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where it was worse:&lt;/strong&gt; answers took 15 s to 2 min 20 s, and a small model can give a real quote that does not answer the question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I did not test the app with Wi-Fi off,&lt;/strong&gt; so I make no offline claim.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Best Use of Gemma: Gemma 4 run locally through Ollama.&lt;/p&gt;

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