<?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: Krishti Singh</title>
    <description>The latest articles on DEV Community by Krishti Singh (@krishti).</description>
    <link>https://dev.to/krishti</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%2F4179428%2F3f6556f9-f68c-4127-bc0c-6c0ab73b7b96.png</url>
      <title>DEV Community: Krishti Singh</title>
      <link>https://dev.to/krishti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krishti"/>
    <language>en</language>
    <item>
      <title>Scope-Creep Catcher</title>
      <dc:creator>Krishti Singh</dc:creator>
      <pubDate>Sat, 17 Oct 2026 23:41:29 +0000</pubDate>
      <link>https://dev.to/krishti/scope-creep-catcher-1jp7</link>
      <guid>https://dev.to/krishti/scope-creep-catcher-1jp7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Freelancers and digital agencies face this scenario on almost every single project:&lt;br&gt;
You agree to build a 4-page website for a client for a fixed price of $1,000. After you deliver the work, the casual emails start coming in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Can you just add one more page for our case studies?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Can you quickly tweak the brand colours and rebuild the mobile layout?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Can you connect our custom CRM while you're in there?"&lt;/em&gt;
You don't want to jeopardise the relationship or look unhelpful to them, so you say yes. Before you know it, you have spent 15 extra hours doing unbilled work. In the freelance industry, this is called &lt;strong&gt;Scope Creep&lt;/strong&gt;, and it silently drains thousands of dollars in billable revenue every year.
&lt;strong&gt;Scope-Creep Catcher&lt;/strong&gt; is a private, local desktop application that eliminates scope creep before it starts. It runs 100% offline on your own laptop using compact open-weight models, ensuring your client contracts, rates, and email threads never touch a third-party cloud server.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What does it do?
&lt;/h3&gt;

&lt;p&gt;Scope-Creep Catcher acts as a 24/7 contract bodyguard across the three phases of any client engagement:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Before You Sign (SOW Stress Test):&lt;/strong&gt;
Paste in your draft Statement of Work (SOW). Python algorithms and local open-weight AI scan it for missing safety clauses (example: omitted revision caps or vague terms, deadlines or milestones) and flag high-risk phrases like &lt;em&gt;"minor tweaks as needed"&lt;/em&gt;, giving you instant, copy-paste replacement clauses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;During the Project (Client Request Checker):&lt;/strong&gt;
When a client sends a message, paste it into the tool. The local model splits compound emails into discrete requests, matches them against agreed deliverables, and displays an immediate traffic-light verdict:

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Included:&lt;/strong&gt; Work already covered by the signed agreement.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Billable Extra:&lt;/strong&gt; New work that requires an additional fee and extra hours.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Needs Clarification:&lt;/strong&gt; Ambiguous requests that require scoping before starting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Getting Paid (Priced Pushback &amp;amp; Change Orders):&lt;/strong&gt;
Saying no or asking for extra budget is awkward. The tool calculates exact billable costs based on your hourly rate. It generates a polite, professional reply email (in your choice of Friendly or Formal tone), complete with an itemised Markdown Change Order (&lt;code&gt;change_order.md&lt;/code&gt;) ready for the client to sign. The freelancer can download it and send it to the client.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Who Would Pay for It?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freelance Web Developers &amp;amp; Designers:&lt;/strong&gt; Who constantly deal with clients asking for extra revisions, unlisted pages, or out-of-scope features that eat into their profits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copywriters &amp;amp; Consultants:&lt;/strong&gt; Whose projects get dragged out for weeks by vague client requests like &lt;em&gt;"just tweak it until we're happy"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small Digital Agencies:&lt;/strong&gt; Who need a clear, professional audit trail to justify billing extra hours without damaging their client relationships.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The ROI:&lt;/strong&gt; For a freelancer charging $75/hour, catching just &lt;strong&gt;two unbilled hours of extra work a month saves $150/month ($1,800/year)&lt;/strong&gt;, easily justifying paying for this tool.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  What Problem Does It Solve?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loophole-Filled Contracts (Before You Sign):&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Catches missing revision caps, missing deadlines, and risky open-ended phrases (&lt;em&gt;"as needed"&lt;/em&gt;, &lt;em&gt;"until satisfied"&lt;/em&gt;). It provides instant, copy-paste bulletproof clauses so you can fix your contract before signing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sneaky, Mixed Client Emails:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Clients rarely ask for extra work directly; they mix small fixes with brand-new features in one casual email. The tool automatically splits these compound emails into separate, single requests (for example, recognizing that fixing a button is included, but adding a new blog page is billable extra work).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Awkward Money Conversations &amp;amp; Manual Math:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It eliminates the stress of asking clients for more money. The tool automatically calculates extra billable hours and costs based on your hourly rate, then drafts a polite, professional reply email (Friendly or Formal) with an itemized Markdown Change Order (&lt;code&gt;change_order.md&lt;/code&gt;) ready for the client to sign.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Untracked Revision Quotas:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Most freelancers lose track of how many rounds of edits a client has used. The tool maintains a local project audit log that tracks your quota in real time (e.g., &lt;em&gt;"Round 2 of 2 used"&lt;/em&gt;), alerting you the moment free revisions are exhausted so you never do unpaid overtime.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Pre-Signature SOW Stress Test
&lt;/h3&gt;

&lt;p&gt;Paste your draft contract before signing. The tool scans for missing clauses and ambiguous phrases like "minor tweaks as needed", flagging the risks and providing instant, bulletproof rewrite clauses.&lt;br&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%2Fgaf0wlz6sxexzkiq06u8.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%2Fgaf0wlz6sxexzkiq06u8.png" alt="Pre-Signature SOW Stress Test" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Client Request Checker (Traffic-Light Verdicts)
&lt;/h3&gt;

&lt;p&gt;When a client sends a compound email mixing multiple requests, paste the message into the tool. It breaks down the email into atomic items and provides an instant traffic-light verdict:&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%2Fbecjg9wpz1ujmt18e50s.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%2Fbecjg9wpz1ujmt18e50s.png" alt=" Client Request Checker (Traffic-Light Verdicts)" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Live Revision Quota Tracker &amp;amp; Audit Log
&lt;/h3&gt;

&lt;p&gt;Keep track of how many rounds of edits the client has used. When the free revision quota is exhausted, the tool alerts you so you never do unpaid revisions.&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%2F1047jjcav5955anielwm.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%2F1047jjcav5955anielwm.png" alt="Live Revision Quota Tracker &amp;amp; Audit Log" width="800" height="725"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  How to Run It Locally in 60 Seconds:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the repository&lt;/span&gt;
git clone https://github.com/Krishtiy/Scope_Creep.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Scope_Creep

&lt;span class="c"&gt;# 2. Install dependencies &amp;amp; pull the local model&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
ollama pull qwen2.5:3b   &lt;span class="c"&gt;# or: ollama pull gemma2:2b&lt;/span&gt;

&lt;span class="c"&gt;# 3. Launch the dashboard&lt;/span&gt;
streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;p&gt;The entire codebase is open-source under the MIT license:&lt;br&gt;
&lt;/p&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/Krishtiy" rel="noopener noreferrer"&gt;
        Krishtiy
      &lt;/a&gt; / &lt;a href="https://github.com/Krishtiy/Scope_Creep" rel="noopener noreferrer"&gt;
        Scope_Creep
      &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;Scope-Creep Catcher 🔍&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;A local, open-weight AI tool that protects freelancers and consultants from unpaid extra work.&lt;br&gt;
Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 2: Side Hustle&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;100% Offline &amp;amp; Private:&lt;/strong&gt; Client agreements and confidential messages never leave your machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 What It Does&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Freelancers and agency owners lose thousands of dollars each year to &lt;strong&gt;"scope creep"&lt;/strong&gt; the slow, sneaky accumulation of unbilled tweaks, vague client demands, and endless revision rounds that turn a profitable gig into unpaid overtime.&lt;/p&gt;
&lt;p&gt;To solve this, &lt;strong&gt;Scope-Creep Catcher&lt;/strong&gt; is built around &lt;strong&gt;4 Core Features&lt;/strong&gt; that protect you across the three phases of any client contract:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;                  ┌────────────────────────────────────────────────────────┐
                  │          THE FREELANCE PROJECT LIFECYCLE               │
                  └──────────────────────────┬─────────────────────────────┘
                                             │
      ┌──────────────────────────────────────┼──────────────────────────────────────┐
      ▼                                      ▼                                      ▼
[ BEFORE YOU SIGN ]                 [ DURING THE PROJECT ]                 [ CLOSING THE DEAL ]
Feature 1: SOW Stress Test          Feature 2: Request Checker             Feature 3: Change Orders
• Scans contract traps              • Splits&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Krishtiy/Scope_Creep" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
You can also explore the repository directly on GitHub: &lt;a href="https://github.com/Krishtiy/Scope_Creep" rel="noopener noreferrer"&gt;github.com/Krishtiy/Scope_Creep&lt;/a&gt;


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



&lt;p&gt;When building a tool that handles legal contracts and money, you run into a big problem with AI: &lt;strong&gt;models can make things up, do bad math, or be easily tricked when a client asks nicely.&lt;/strong&gt; If an AI makes a mistake on a contract, a freelancer could either lose money or ruin a client relationship.&lt;/p&gt;

&lt;p&gt;To prevent this, I designed the app around a simple principle: &lt;strong&gt;The AI reads the text, but the code makes the final decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the exact flow of how the project is built and works:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Open-Source AI Engine (100% Local &amp;amp; Private)
&lt;/h3&gt;

&lt;p&gt;Because client contracts and rates are confidential, the app runs completely offline on your own computer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Inference with Ollama:&lt;/strong&gt; I used &lt;strong&gt;Ollama&lt;/strong&gt; so the app can run open-weight AI models locally on a standard laptop CPU no expensive graphics cards, cloud servers, or any API subscriptions needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choosing the Right Model:&lt;/strong&gt; I tested two compact open-weight models:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma 2 (2B):&lt;/strong&gt; A fast and lightweight model from Google.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5 (3B):&lt;/strong&gt; Renowned for its ability to follow strict instructions and output clean, structured data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During testing, Qwen 2.5 achieved &lt;strong&gt;0% false accusations&lt;/strong&gt; against clients, making it the default engine for the project (while keeping full support for Gemma 2).&lt;/p&gt;
&lt;h3&gt;
  
  
  2. How the App Works (The Step-by-Step Flow)
&lt;/h3&gt;

&lt;p&gt;Whenever you use the app your contract and client messages go through a smooth, automated flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reading the Contract:&lt;/strong&gt; You paste your project agreement into the app. The local AI reads through the contract and extracts the key details such as agreed deliverables, deadlines, how many revision rounds are included, and what work is explicitly excluded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stress-Testing for Traps:&lt;/strong&gt; Before you sign anything, Python code checks the contract for common traps (like missing revision caps or vague phrases like &lt;em&gt;"work until satisfied"&lt;/em&gt;). It warns you and suggests safe sentences to replace them with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Splitting Client Messages:&lt;/strong&gt; When a client sends a long, mixed email, the AI splits it into separate single requests. For example, it separates &lt;em&gt;"fix the mobile menu"&lt;/em&gt; from &lt;em&gt;"add a new blog page"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Code Safety Net (Firewall):&lt;/strong&gt; This is the most important part of the app. The AI suggests an initial opinion, but &lt;strong&gt;standard Python code has the final say&lt;/strong&gt;. The code runs checks to make sure the AI didn't hallucinate a clause that isn't in the contract, and overrides the AI if a client asks for work that was clearly excluded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exact Pricing Math:&lt;/strong&gt; Instead of letting the AI guess numbers, Python code calculates the exact extra hours and cost using your set hourly rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polite Draft &amp;amp; Change Order:&lt;/strong&gt; The AI drafts a friendly or formal email explaining the extra work, attaching a clean, ready-to-sign Change Order document with the exact price breakdown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracking the Project:&lt;/strong&gt; The app automatically saves your project history in a local file on your computer, keeping track of how many revision rounds the client has used up so far.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  3. The Tech Stack Behind It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Interface:&lt;/strong&gt; Streamlit (a clean, responsive web dashboard that opens in your browser).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend &amp;amp; Logic:&lt;/strong&gt; Python 3 (handles the rules, text verification, and pricing math).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local AI:&lt;/strong&gt; Ollama running compact open-weight models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation &amp;amp; Observability:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backboard.io:&lt;/strong&gt; Used to benchmark our local app against large cloud models on sample test contracts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entire.io:&lt;/strong&gt; Used to track and record agent sessions and checkpoints during development.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


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



&lt;p&gt;When you’re dealing with client contracts, freelance rates, and confidential project details, &lt;strong&gt;open innovation isn't just a technical preference it’s the only way this tool can safely exist.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what open-source AI and open-weight models made possible that a closed cloud API never could:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. 100% Privacy and NDA Protection
&lt;/h3&gt;

&lt;p&gt;Freelancers and agencies sign strict Non-Disclosure Agreements (NDAs). Sending confidential client contracts, trade secrets, or private email discussions to a closed third-party cloud API can easily break those agreements. &lt;br&gt;
Because open-weight models can run locally on your own computer, &lt;strong&gt;your client’s data never leaves your machine.&lt;/strong&gt; You can even turn your Wi-Fi completely off, and the entire app still works.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Zero Monthly API Costs
&lt;/h3&gt;

&lt;p&gt;Closed APIs charge you for every token you send. For a freelancer or small agency trying to keep expenses low, an unpredictable monthly API bill is a real barrier. With open models, you download the model once and pay the price once, and it’s free to run forever on your laptop no subscriptions, no credit card required, and no fear of surprise bills.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. No Risk of Sudden Changes or Model Shutdowns
&lt;/h3&gt;

&lt;p&gt;With closed APIs, companies can change their pricing overnight, alter how their models respond, or suddenly retire the version your code relies on. Open-weight models (like Google Gemma 2 and Qwen 2.5) give you total ownership. The weights stay on your machine, ensuring your workflow will never break because of an unexpected API deprecation.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Work from Anywhere (Truly Offline)
&lt;/h3&gt;

&lt;p&gt;Freelancers don’t just work at office desks they work from coffee shops, trains, flights, and places with weak or zero Wi-Fi. Because of open innovation, you can review contracts and verify client requests anywhere in the world without needing an internet connection.&lt;/p&gt;


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



&lt;p&gt;I used Google Antigravity as my pair programmer to build Scope-Creep Catcher from scratch.&lt;/p&gt;

&lt;p&gt;Right from the beginning, I had an implementation plan. I wanted a tool that runs 100% offline on a normal laptop, keeps client contracts private, and never wrongly accuses a client of scope creep.&lt;/p&gt;

&lt;p&gt;Instead of letting the AI guess everything, I guided it step by step through each phase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM reads, Python decides:&lt;/strong&gt; We used the local model only to read messy emails, while hard Python code makes the final legal and contract rulings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No fake quotes:&lt;/strong&gt; We added fuzzy string matching so the model can't invent clauses that aren't in the contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exact pricing math:&lt;/strong&gt; We made sure Python does all the billable math so prices are always 100% accurate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing &amp;amp; Benchmarks:&lt;/strong&gt; We ran 100 unit tests and benchmarked Qwen 2.5 against Gemma 2 and Backboard to prove we got 0% false accusations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can scroll through our full build session below to see the prompts, code changes, and test results:&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Gemini CLI"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Scope-Creep Catcher: Architecture &amp;amp; Design Decisions with AI&lt;/span&gt;
  &lt;/div&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;I have provided the comprehensive implementation plan for Scope-Creep Catcher in the project root. Go through it and read it carefully. I need you to initialize the repo and set up the virtual environment.&lt;/p&gt;

&lt;p&gt;We are building this for the Hacktoberfest Open-Source AI Challenge (Side Hustle track) to protect freelancers from unbilled overtime.&lt;/p&gt;

&lt;p&gt;Here are the critical architectural constraints from my plan:&lt;br&gt;
1. 100% Offline &amp;amp; Private: Client contracts and billing rates must never leave the freelancer's machine. We will use local open-weight models via Ollama on consumer laptop CPUs.&lt;br&gt;
2. The Core Principle: 'LLM Reads, Code Decides' — the local LLM must be strictly an information extractor, never the final judge. Deterministic Python code must enforce the contract boundaries so we achieve 0% false accusations.&lt;br&gt;
3. Partner Integrations: Use Backboard.io for synthetic benchmark evaluations, and Entire.io for agent observability.&lt;/p&gt;

&lt;p&gt;Execute the plan in phases, and let's discuss key design decisions at each step before committing code.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Reviewed the implementation plan thoroughly. Setting up the repository, venv, and directory layout (&lt;code&gt;engine/&lt;/code&gt;, &lt;code&gt;config/&lt;/code&gt;, &lt;code&gt;data/&lt;/code&gt;, &lt;code&gt;eval/&lt;/code&gt;, &lt;code&gt;tests/&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="agent-session-978-1--design-decision-1-overcoming-small-local-model-limitations-s1--s3"&gt;💡 Design Decision 1: Overcoming Small Local Model Limitations (S1 &amp;amp; S3)&lt;/h3&gt;

&lt;p&gt;Since freelancers run on standard laptop CPUs without $10,000 GPUs, we are targeting the 2B–3B parameter class (Qwen 2.5 3B and Google Gemma 2 2B).&lt;br&gt;
However, small models have known failure modes: dropping JSON fields and hallucinations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Architecture Solution:&lt;/strong&gt;&lt;br&gt;
1. In &lt;code&gt;engine/sow.py&lt;/code&gt; (Step S1), we constrain the LLM with strict Pydantic v2 schemas (&lt;code&gt;SOWFacts&lt;/code&gt;) and add deterministic regex fallbacks so if the model misses a field (like revision rounds or client responsibilities), code automatically fills it.&lt;br&gt;
2. In &lt;code&gt;engine/checker.py&lt;/code&gt; (Step S3), clients send messy compound emails. The LLM's only job is splitting them into atomic single-action requests (&lt;code&gt;SplitRequest&lt;/code&gt;), not ruling on them.&lt;/p&gt;

&lt;p&gt;Let's write the SOW parser and request splitter.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/sow.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/sow.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Created engine/sow.py with Pydantic SOWFacts schema, regex fallbacks, and NFKC text normalization.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/checker.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/checker.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Created engine/checker.py with atomic message splitting into distinct single-action requests.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Now for the most critical part: Step S5 (The Rule Engine). How do we ensure that if a client asks nicely in an email ('Could you quickly add this tiny blog page?'), the AI isn't tricked by their polite tone into giving away free work? And what if the AI hallucinates a contract clause?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;h3 id="agent-session-978-3--design-decision-2--3-the-deterministic-firewall-r0r8-and-rapidfuzz-verifier"&gt;💡 Design Decision 2 &amp;amp; 3: The Deterministic Firewall (&lt;code&gt;R0&lt;/code&gt;–&lt;code&gt;R8&lt;/code&gt;) and RapidFuzz Verifier&lt;/h3&gt;

&lt;p&gt;This is where &lt;strong&gt;'LLM Reads, Code Decides'&lt;/strong&gt; saves the freelancer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;3-Tier Verbatim Quote Verifier (&lt;code&gt;engine/verifier.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
If the AI cites a contract clause to justify extra work, we run RapidFuzz token alignment. If the quote doesn't exist verbatim in the contract, &lt;strong&gt;Rule R0 (Quote Verification Guard)&lt;/strong&gt; immediately fires, nulling the citation and forcing an &lt;code&gt;unverified&lt;/code&gt; status so the freelancer never sends a fake citation to a client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deterministic Rules that Override AI Tone Bias (&lt;code&gt;engine/rules.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
In Step S4, the LLM only gives a &lt;em&gt;tentative suggestion&lt;/em&gt;. In Step S5, Python rules evaluate in strict priority:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule R1 (Explicit Exclusion):&lt;/strong&gt; If SOW lists &lt;code&gt;"Excluded: SEO"&lt;/code&gt;, Python strictly forces &lt;code&gt;out_of_scope&lt;/code&gt;, even if the AI thought SEO was standard web dev.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule R2 (Unlisted Page):&lt;/strong&gt; Checks the approved page list &lt;code&gt;['Home', 'About', 'Pricing', 'Contact']&lt;/code&gt;. An unlisted page is strictly forced &lt;code&gt;out_of_scope&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule R3 (Revision Quota):&lt;/strong&gt; Checks &lt;code&gt;rounds_used &amp;gt;= rounds_max&lt;/code&gt;. Free revisions are exhausted; code strictly marks it billable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule R8 (Code Always Wins):&lt;/strong&gt; Any disagreement between Python code and the LLM, Python code has absolute final authority.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Writing &lt;code&gt;engine/rules.py&lt;/code&gt; and &lt;code&gt;engine/verifier.py&lt;/code&gt; now.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/rules.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/rules.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Implemented rules R0 through R8 in engine/rules.py with priority-based verdict overrides.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/verifier.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/verifier.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Implemented verifier.py with 3-tier RapidFuzz quote verification and number token mismatch guards.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Now for Phase 2: Pricing and Client Communication (Steps S6, S7, S8). LLMs frequently hallucinate arithmetic (multiplying hours by rates inconsistently). How do we make sure pricing is mathematically exact, and how does the quota tracking work across rounds?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;h3 id="agent-session-978-5--design-decision-4-deterministic-pricing-math--the-regex-number-guard"&gt;💡 Design Decision 4: Deterministic Pricing Math &amp;amp; The Regex Number Guard&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pure Python Pricing (&lt;code&gt;engine/pricing.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
The LLM is completely banned from doing math. Estimated hours are looked up deterministically from &lt;code&gt;config/hours.yaml&lt;/code&gt; complexity tiers (S/M/L) and multiplied by the freelancer's hourly rate (&lt;code&gt;hours * rate&lt;/code&gt;) in pure Python.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regex Number Guard in Email Drafter (&lt;code&gt;engine/drafter.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
The LLM drafts the polite client email (Friendly or Formal tone) and the Markdown Change Order (&lt;code&gt;change_order.md&lt;/code&gt;). Before sending, a regex Number Guard inspects the generated text. If any dollar amount or hour figure differs from the Python pricing calculation by even 1 cent, it is rejected and corrected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Quota Tracker &amp;amp; Audit Ledger (&lt;code&gt;engine/state.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
Maintains a local JSON ledger (&lt;code&gt;data/projects/{name}.json&lt;/code&gt;). When a revision is approved, it decrements the quota (e.g. &lt;code&gt;1 of 2 rounds used&lt;/code&gt;). Once exhausted, Rule R3 flags the next round as billable extra work.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Implementing &lt;code&gt;engine/pricing.py&lt;/code&gt;, &lt;code&gt;engine/drafter.py&lt;/code&gt;, and &lt;code&gt;engine/state.py&lt;/code&gt;.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/pricing.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/pricing.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Implemented deterministic pricing calculations using YAML complexity tables.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/drafter.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/drafter.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Implemented response drafter with Change Order generator and regex Number Guard.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;engine/state.py&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;engine/state.py&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Implemented persistent JSON project state, quota decrements, and audit logs.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Let's move to Phase 3: Testing &amp;amp; Evaluation. Run all offline unit tests first. Then run the benchmark tournament across our 23 synthetic gold contract scenarios to evaluate Qwen 2.5 3B vs Google Gemma 2 2B vs Backboard 70B Cloud. What were the empirical findings?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Running the unit tests and the empirical evaluation suite now:&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcommand"&gt;run_command&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;pytest -v&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ pytest -v&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;100 passed in 1.35s (100% passing test suite across rules, verification, pricing, and state).&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcommand"&gt;run_command&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;python -m eval.run_eval --model qwen2.5:3b --mode pipeline --split test&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ python -m eval.run_eval --model qwen2.5:3b --mode pipeline --split test&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Pipeline accuracy: 60.0% (9/15). False Accusation Rate (FAR): 0.0% (0/7).&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcommand"&gt;run_command&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;python -m eval.run_eval --model gemma2:2b --mode pipeline --split test&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ python -m eval.run_eval --model gemma2:2b --mode pipeline --split test&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Pipeline accuracy: 33.3% (5/15). False Accusation Rate (FAR): 14.3% (1/7).&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcommand"&gt;run_command&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;python -m eval.run_backboard --split test --model meta-llama/llama-3.1-70b-in...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ python -m eval.run_backboard --split test --model meta-llama/llama-3.1-70b-instruct&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Backboard 70B Cloud accuracy: 20.0% (3/15). Over-hedged on gray areas.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;h3 id="agent-session-978-7--design-decision-5-the-empirical-model-selection-verdict"&gt;💡 Design Decision 5: The Empirical Model Selection Verdict&lt;/h3&gt;

&lt;p&gt;In client freelancing, a &lt;strong&gt;false accusation of scope creep&lt;/strong&gt; on work already paid for destroys trust. Our evaluation benchmark revealed:&lt;br&gt;
1. &lt;strong&gt;Gemma 2 (2B):&lt;/strong&gt; Had a 14.3% False Accusation Rate (FAR) because it dropped JSON fields and paraphrased clauses, causing verifier rejections.&lt;br&gt;
2. &lt;strong&gt;Qwen 2.5 (3B):&lt;/strong&gt; Followed Pydantic schemas reliably, extracted exact verbatim quotes, and under our deterministic rule engine achieved &lt;strong&gt;0.0% False Accusations&lt;/strong&gt; with double the pipeline accuracy (60.0% vs. 33.3%).&lt;br&gt;
3. &lt;strong&gt;Backboard.io Cloud Baseline:&lt;/strong&gt; Benchmarked 70B cloud models against our local pipeline, proving that ungrounded cloud LLMs over-hedge and waffle into gray areas without deterministic rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision:&lt;/strong&gt; We locked &lt;strong&gt;&lt;code&gt;qwen2.5:3b&lt;/code&gt;&lt;/strong&gt; as the default production model in &lt;code&gt;engine/config.py&lt;/code&gt; while preserving 100% drop-in compatibility for &lt;strong&gt;&lt;code&gt;gemma2:2b&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Phase 4 is complete: The Streamlit UI (&lt;code&gt;app.py&lt;/code&gt;) is live with SOW Stress Testing, Request Checking, and Quota Tracking!&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

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


&lt;blockquote&gt;
&lt;p&gt;🔗 &lt;em&gt;If the widget above doesn't load, you can also view the &lt;a href="https://dev.to/agent_sessions/scope-creep-catcher-architecture-design-decisions-with-ai-rp6rqq"&gt;interactive session directly on DEV&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;To test Scope-Creep Catcher in the real world, I ran a simulated user trial using a real past web development contract from a freelance WordPress developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Scenario:&lt;/strong&gt; The contract included a 5-page business website with 2 rounds of design revisions. Midway through the project, the client sent a compound email asking to fix a mobile header bug and add a brand-new multi-tier pricing table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; The developer pasted the email into Scope-Creep Catcher. The tool correctly categorized the header fix as  &lt;strong&gt;Included&lt;/strong&gt; and the pricing table as  &lt;strong&gt;Billable Extra (3 hours)&lt;/strong&gt;. It generated a polite Change Order email requesting $225.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The User's Feedback:&lt;/strong&gt; Usually I would have just built the pricing table for free because I hated having the awkward 'that will cost extra' conversation. Having the tool automatically generate a polite, itemized change order makes it feel objective rather than defensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Did They Pay / Would They Pay?&lt;/strong&gt; While they tested this on a completed past project, they confirmed they would gladly pay &lt;strong&gt;$15–$20/month&lt;/strong&gt; for the tool, noting that recovering just one 3-hour request ($225) covers the cost for the entire year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What They Asked for Next:&lt;/strong&gt; A direct Gmail/browser plugin that alerts them to out-of-scope requests right inside their inbox before they hit reply.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;I am entering the following partner categories for the Hacktoberfest AI Challenge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma (Featured Category):&lt;/strong&gt; Evaluated and integrated Google Gemma 2 (2B) via local Ollama inference (&lt;code&gt;gemma2:2b&lt;/code&gt;), providing a lightweight, open-weight model option for running contract analysis on consumer laptops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Backboard:&lt;/strong&gt; Integrated Backboard SDK (&lt;code&gt;eval/run_backboard.py&lt;/code&gt;) to benchmark local model performance against 70B cloud models using synthetic contract test scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Entire:&lt;/strong&gt; Instrumented development checkpoints, prompt runs, and session logs in &lt;code&gt;.entire/&lt;/code&gt; using the Entire CLI.&lt;/li&gt;
&lt;/ul&gt;




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