<?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: Abdul Wasih</title>
    <description>The latest articles on DEV Community by Abdul Wasih (@iamwasih).</description>
    <link>https://dev.to/iamwasih</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%2F4159774%2Fab9c702a-be12-4352-92a4-344eb1ca60b7.png</url>
      <title>DEV Community: Abdul Wasih</title>
      <link>https://dev.to/iamwasih</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamwasih"/>
    <language>en</language>
    <item>
      <title>Viva: a mock interview that knows which parts of your project an AI wrote</title>
      <dc:creator>Abdul Wasih</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:57:13 +0000</pubDate>
      <link>https://dev.to/iamwasih/viva-a-mock-interview-that-knows-which-parts-of-your-project-an-ai-wrote-ahe</link>
      <guid>https://dev.to/iamwasih/viva-a-mock-interview-that-knows-which-parts-of-your-project-an-ai-wrote-ahe</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;If you have sat in a placement interview, you know the moment.&lt;/p&gt;

&lt;p&gt;The interviewer stops scrolling through your repo, points at one file, and says: "Walk me through this function."&lt;/p&gt;

&lt;p&gt;You know what the function does. You typed the prompt that produced it. You did not write it.&lt;/p&gt;

&lt;p&gt;That happened to a friend of mine, with a project the two of us built at a hackathon. It works. It is on his resume. He could tell you what every screen does. He could not tell you why the code is the way it is, because an AI agent wrote a lot of it and we shipped before we understood it.&lt;/p&gt;

&lt;p&gt;Every fresher I know is a little scared of that question. So I built &lt;strong&gt;Viva&lt;/strong&gt;: a mock interview about your own project, that knows which parts an AI wrote.&lt;/p&gt;

&lt;p&gt;You give it a repo. It reads the code, finds the files your coding agent wrote, and then interviews you the way a panel would. When it reaches the AI-written part, it says so:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your Entire session shows an AI agent wrote &lt;code&gt;src/lib/interview/prompts.ts&lt;/code&gt; (the prompt was: "1,2 isdone lets skip teh devrealy install, render and eleven labs credits i will claim, yep lets do stacked prs"). Explain the logic behind how &lt;code&gt;briefPrompt&lt;/code&gt; structures the input data to ensure the generated brief remains grounded in the actual repository content.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a real question Viva asked me, about Viva. The typos in the prompt are mine.&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%2F5kmmo2h4io9ytpsvp9n0.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%2F5kmmo2h4io9ytpsvp9n0.png" alt="Viva asking about a file an AI agent wrote, quoting the prompt from the coding session above the question." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://viva-ou6t.onrender.com" rel="noopener noreferrer"&gt;https://viva-ou6t.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;"Viva (this project)"&lt;/strong&gt; to see the AI-code question straight away, or paste any public GitHub repo (reading a new one takes about 45 seconds).&lt;/p&gt;

&lt;p&gt;In the video, the candidate is simulated and the voice is Kokoro, an open speech model running on my laptop. The app on screen is real, with the waiting cut out.&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/AbdulWasih05" rel="noopener noreferrer"&gt;
        AbdulWasih05
      &lt;/a&gt; / &lt;a href="https://github.com/AbdulWasih05/Viva" rel="noopener noreferrer"&gt;
        Viva
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local first AI interview coach 
    &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;Viva&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A mock technical interview about your own project, for the AI-coding era.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Students now ship projects an AI agent half-wrote, and interviewers know it. Viva reads your repo, finds the parts an agent wrote, and questions you about them the way a placement interviewer or a final-year viva panel would. It asks follow-ups based on what you actually said, remembers your weak spots, and ends with a scored report.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest 2026 Weekend Challenge (Build for a Friend). The interviewer is &lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma&lt;/a&gt;, an open-weight model; &lt;a href="https://mastra.ai" rel="nofollow noopener noreferrer"&gt;Mastra&lt;/a&gt; runs the agent; &lt;a href="https://entire.io" rel="nofollow noopener noreferrer"&gt;Entire&lt;/a&gt; checkpoints tell Viva which code an AI wrote.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://render.com/deploy?repo=https://github.com/AbdulWasih05/Viva" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c3053e93bc9f0a2cd84050a5ff9f07cc5e639621a72e50dce48781f4a38f10e2/68747470733a2f2f72656e6465722e636f6d2f696d616765732f6465706c6f792d746f2d72656e6465722d627574746f6e2e737667" alt="Deploy to Render"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reads your project.&lt;/strong&gt; Paste a public GitHub URL (or, in local mode, a folder path). Viva picks the most telling files and Gemma writes a short brief. Every file path in that brief is checked against the real file list; invented ones are dropped.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AbdulWasih05/Viva" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;One rule runs through the code: &lt;strong&gt;Gemma decides what to say. Code decides what happens.&lt;/strong&gt; The round order, the follow-up limit, the scores and every file path are plain, tested TypeScript.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;What it does in Viva&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4 26B&lt;/strong&gt; (open weights)&lt;/td&gt;
&lt;td&gt;The interviewer: writes the brief, the questions, the scores and the report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mastra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runs the interviewer as an agent with a &lt;code&gt;readFile&lt;/code&gt; tool, and remembers your weak spots between sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entire&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Records each coding-agent session next to its commit. Viva reads that to find AI-written code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sentry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Traces every interview turn, with quality flags on each one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Render&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hosts it. One free service, no database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;An interview in four moves.&lt;/strong&gt; Viva reads the repo and Gemma writes a brief; code throws out any file path Gemma made up. For a code question, the agent opens the file itself before asking. After each answer, Gemma scores it and may follow up, but the follow-up has to quote something you actually said, and code checks the quote. At the end, code adds up the scores and Gemma writes the coaching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I measured&lt;/strong&gt;, across scripted interviews on two real repos:&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;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model replies that passed the schema check&lt;/td&gt;
&lt;td&gt;119 of 119&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep-dive questions that named a real file&lt;/td&gt;
&lt;td&gt;6 of 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-ups that really quoted the answer&lt;/td&gt;
&lt;td&gt;51 of 51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code questions where the agent opened a file first&lt;/td&gt;
&lt;td&gt;18 of 18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Second session opened with last time's weak spot&lt;/td&gt;
&lt;td&gt;3 of 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interviews on Viva's own repo that asked about AI-written code&lt;/td&gt;
&lt;td&gt;3 of 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How Viva knows what the AI wrote.&lt;/strong&gt; A file counts as AI-written when it was changed in a commit that Entire linked to a coding-agent session. The prompt Viva quotes is the one you typed in that session, taken from the session transcript.&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%2Fn1jl13m8yabw9l6cmoup.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%2Fn1jl13m8yabw9l6cmoup.png" alt=" A Sentry trace of one Viva interview turn, with flags showing the question was about AI-written code, named a real file, and needed no retry or fallback." width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That Sentry trace is one interview turn: &lt;code&gt;question_names_real_file: true&lt;/code&gt;, &lt;code&gt;ai_authored_question: true&lt;/code&gt;, no retry, no fallback. Each turn carries these flags, so I can see whether the interviewer is doing its job without reading every chat.&lt;/p&gt;

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

&lt;p&gt;Because of who this is for.&lt;/p&gt;

&lt;p&gt;A student should not need a credit card to practise for an interview. His next project may be private. A college lab may have no reliable internet. With an open model, the same code talks to Gemma on a server or to Gemma on your own machine through Ollama, and switching is one setting. A closed API does not give you that choice.&lt;/p&gt;

&lt;p&gt;Nobody has to trust my copy either. The prompts and the scoring rubric are plain files, and the Deploy button gives any coding club its own private Viva.&lt;/p&gt;

&lt;p&gt;Open is not free, and I measured the price. On my 16 GB laptop with no real GPU, local Gemma took 50 to 544 seconds per call and never finished a project brief. So today, local mode needs better hardware than a student usually has. But that is a limit I can see and work on, in code I can read.&lt;/p&gt;

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

&lt;p&gt;The whole build is public. Each phase is one commit, and each commit carries its Entire checkpoint: the same data Viva reads to interview me. Every decision is numbered, with its reason, in &lt;a href="https://github.com/AbdulWasih05/Viva/blob/main/docs/DECISIONS.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/DECISIONS.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; the interviewer itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mastra:&lt;/strong&gt; the agent, its tools and its memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entire:&lt;/strong&gt; the source of every AI-code question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing:&lt;/strong&gt; each turn traced with quality flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render:&lt;/strong&gt; hosting and a one-click blueprint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still to build: voice answers, showing what the agent reads while it reads, and getting a turn under 8 seconds (a new question takes 11 to 14 today).&lt;/p&gt;

&lt;p&gt;Have you been asked to explain code your AI wrote? How did it go? Tell me in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I built Viva with an AI coding agent (Claude Code). The numbers are measured and the sessions are public in the repo.&lt;/em&gt;&lt;/p&gt;

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