<?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: Emma_AkpanItoro</title>
    <description>The latest articles on DEV Community by Emma_AkpanItoro (@emmanuelonyekachi21).</description>
    <link>https://dev.to/emmanuelonyekachi21</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1482274%2F9dc5c862-af20-4aaf-9d22-c831b2381e1f.png</url>
      <title>DEV Community: Emma_AkpanItoro</title>
      <link>https://dev.to/emmanuelonyekachi21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emmanuelonyekachi21"/>
    <language>en</language>
    <item>
      <title>Building Meridian: Week 1-2 Update — Exhausted, Excited, and Still Going</title>
      <dc:creator>Emma_AkpanItoro</dc:creator>
      <pubDate>Fri, 06 Mar 2026 12:43:31 +0000</pubDate>
      <link>https://dev.to/emmanuelonyekachi21/building-meridian-week-1-2-update-exhausted-excited-and-still-going-80c</link>
      <guid>https://dev.to/emmanuelonyekachi21/building-meridian-week-1-2-update-exhausted-excited-and-still-going-80c</guid>
      <description>&lt;p&gt;I'm building &lt;strong&gt;Criterion&lt;/strong&gt; — a GitLab AI agent that reviews merge requests and surfaces forgotten design decisions before they cause production incidents.&lt;/p&gt;

&lt;p&gt;This is my submission for the GitLab AI Hackathon. Deadline: March 25. The clock is very much ticking.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Criterion Does
&lt;/h2&gt;

&lt;p&gt;Every engineering team has this problem: a developer refactors some auth code, not knowing it was carefully designed 8 months ago to handle an enterprise SSO edge case. It merges. It breaks in production. A P0 incident follows.&lt;/p&gt;

&lt;p&gt;Criterion sits inside your GitLab workflow and catches this before it happens. When you open a merge request, Criterion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traces git blame on changed lines back to the original commits, MRs, and issues&lt;/li&gt;
&lt;li&gt;Asks Claude to extract not just WHAT was decided, but WHY — the business reason, the security constraint, the incident that caused it&lt;/li&gt;
&lt;li&gt;Posts a structured comment directly on your MR before you merge&lt;/li&gt;
&lt;li&gt;Uses confidence-based actions: block at 90%+, warn at 70%+, inform at 50%+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: &lt;strong&gt;prevent the $50K production incident that happens when developers break historical constraints they didn't know existed.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I've Built So Far
&lt;/h2&gt;

&lt;p&gt;Here's what's actually working:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI backend with async webhook receiver&lt;/li&gt;
&lt;li&gt;Celery + Redis for background job processing&lt;/li&gt;
&lt;li&gt;PostgreSQL with SQLAlchemy 2.x async ORM&lt;/li&gt;
&lt;li&gt;Alembic migrations&lt;/li&gt;
&lt;li&gt;Docker Compose local development&lt;/li&gt;
&lt;li&gt;Streamlit dashboard (skeleton)&lt;/li&gt;
&lt;li&gt;Health check endpoint that actually tests dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitLab Integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webhook receiver with HMAC token verification&lt;/li&gt;
&lt;li&gt;Idempotency — duplicate webhooks are safely ignored&lt;/li&gt;
&lt;li&gt;MR upsert, blame fetching, commit tracing, issue fetching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Analysis Engine&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git blame → commit → MR → issue tracing pipeline&lt;/li&gt;
&lt;li&gt;Claude integration with structured prompts and untrusted content isolation&lt;/li&gt;
&lt;li&gt;WHY/WHAT/CONTEXT/TRADEOFFS extraction&lt;/li&gt;
&lt;li&gt;Acceptance criteria parsing from issue descriptions&lt;/li&gt;
&lt;li&gt;Confidence scoring → action mapping&lt;/li&gt;
&lt;li&gt;Results persisted to PostgreSQL&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Honest Part
&lt;/h2&gt;

&lt;p&gt;I'm a junior developer. I had mentorship throughout this process — structured, rigorous, the kind that doesn't hand you answers but asks uncomfortable questions until you find them yourself.&lt;/p&gt;

&lt;p&gt;Even with that, it was hard.&lt;/p&gt;

&lt;p&gt;Not "hard" in a dramatic way. Hard in the quiet way where you stare at a SQLAlchemy error for an hour, or realize your Celery task is silently swallowing exceptions because you're reusing a rolled-back session, or discover your loop is only returning results from the last iteration and you've been losing data the whole time.&lt;/p&gt;

&lt;p&gt;The bugs that don't crash loudly are the ones that teach you the most.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I Am Today
&lt;/h2&gt;

&lt;p&gt;Today I'm not writing new features. I made a deliberate call to stop and do three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test what I have&lt;/strong&gt; — actually verify the pipeline works end to end&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix what's broken&lt;/strong&gt; — find the quiet failures before they compound&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document what works&lt;/strong&gt; — so I can demo it clearly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's still a lot to build: MR comment posting, the frontend dashboard, deployment, the demo video. And 19 days to do it.&lt;/p&gt;

&lt;p&gt;Excited? Yes. Exhausted? Also yes. Stopping? No.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Python&lt;/code&gt; &lt;code&gt;FastAPI&lt;/code&gt; &lt;code&gt;Celery&lt;/code&gt; &lt;code&gt;Redis&lt;/code&gt; &lt;code&gt;PostgreSQL&lt;/code&gt; &lt;code&gt;SQLAlchemy 2.x&lt;/code&gt; &lt;code&gt;Claude (Anthropic)&lt;/code&gt; &lt;code&gt;python-gitlab&lt;/code&gt; &lt;code&gt;Streamlit&lt;/code&gt; &lt;code&gt;Docker&lt;/code&gt; &lt;code&gt;Alembic&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;If you're building something for the GitLab AI Hackathon or just following along, I'd love to connect. Drop a comment — especially if you've built something similar and hit walls I haven't found yet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Next update: comment posting, frontend, and whether I'm still sane.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>python</category>
      <category>showdev</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>RFC: AI agent for validating MRs against acceptance criteria - does this solve your problem?</title>
      <dc:creator>Emma_AkpanItoro</dc:creator>
      <pubDate>Thu, 19 Feb 2026 12:40:36 +0000</pubDate>
      <link>https://dev.to/emmanuelonyekachi21/rfc-ai-agent-for-validating-mrs-against-acceptance-criteria-does-this-solve-your-problem-1287</link>
      <guid>https://dev.to/emmanuelonyekachi21/rfc-ai-agent-for-validating-mrs-against-acceptance-criteria-does-this-solve-your-problem-1287</guid>
      <description>&lt;h2&gt;
  
  
  Request for Comments: Meridian
&lt;/h2&gt;

&lt;p&gt;I'm building an AI-powered code review agent for the GitLab AI Hackathon and would love feedback from practicing engineers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hypothesis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem 1:&lt;/strong&gt; MRs get merged without fully implementing acceptance criteria, causing requirement drift and rework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2:&lt;/strong&gt; Developers change code without understanding historical design constraints, causing regressions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Estimated 20-30% of merged code needs follow-up work (based on anecdotal observation).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Proposed Solution
&lt;/h2&gt;

&lt;p&gt;An autonomous agent that:&lt;/p&gt;

&lt;h3&gt;
  
  
  Acceptance Criteria Validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;Issue&lt;/span&gt; &lt;span class="c1"&gt;#123:&lt;/span&gt;
  &lt;span class="na"&gt;criteria&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Export to CSV ✓&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Export to JSON ✗&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Include all fields ✗&lt;/span&gt;

&lt;span class="na"&gt;MR Analysis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;implemented&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1/3 criteria&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Block merge&lt;/span&gt;
  &lt;span class="na"&gt;recommendation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Complete remaining criteria or update issue scope&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Historical Context Surfacing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;File&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auth_flow.py&lt;/span&gt;
&lt;span class="na"&gt;Lines changed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;45-67&lt;/span&gt;

&lt;span class="na"&gt;Historical Context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;original_mr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;#89 (8 months ago)&lt;/span&gt;
  &lt;span class="na"&gt;design_decision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SSO&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;requires&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;refresh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;every&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;30s"&lt;/span&gt;
  &lt;span class="na"&gt;edge_case&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enterprise&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;customers&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;need&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;persistent&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sessions"&lt;/span&gt;
  &lt;span class="na"&gt;warning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;changes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;remove&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;refresh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;logic.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SSO&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;may&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;break."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Technical Approach
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; Anthropic Claude 3.5 Sonnet (semantic understanding)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; GitLab Duo Agent Platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture:&lt;/strong&gt; Event-driven (webhooks → async analysis → automated comments)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack:&lt;/strong&gt; Python, FastAPI, PostgreSQL, Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Questions for You
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Problem Validation
&lt;/h3&gt;

&lt;p&gt;Does this problem exist in your team?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Yes, constantly&lt;/li&gt;
&lt;li&gt;[ ] Yes, occasionally
&lt;/li&gt;
&lt;li&gt;[ ] Rarely&lt;/li&gt;
&lt;li&gt;[ ] No, not a problem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Solution Validation
&lt;/h3&gt;

&lt;p&gt;Would automated blocking help or create friction?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MR implements 3/5 criteria → Agent blocks merge&lt;/li&gt;
&lt;li&gt;Dev changes old code → Agent warns about design constraint&lt;/li&gt;
&lt;li&gt;Both scenarios happen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your reaction:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] This would save us hours&lt;/li&gt;
&lt;li&gt;[ ] This would be annoying&lt;/li&gt;
&lt;li&gt;[ ] Depends on accuracy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Workflow Fit
&lt;/h3&gt;

&lt;p&gt;Do you document acceptance criteria in a parseable format?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Yes (checkboxes, bullet points in issues)&lt;/li&gt;
&lt;li&gt;[ ] Partially (sometimes)&lt;/li&gt;
&lt;li&gt;[ ] No (verbal/Slack/tribal knowledge)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Alternative Solutions
&lt;/h3&gt;

&lt;p&gt;What have you tried?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR templates with checklists?&lt;/li&gt;
&lt;li&gt;Manual gating process?&lt;/li&gt;
&lt;li&gt;Code ownership + tribal knowledge?&lt;/li&gt;
&lt;li&gt;Nothing?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. False Positive Tolerance
&lt;/h3&gt;

&lt;p&gt;How accurate would this need to be?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50% accurate → Would you use it?&lt;/li&gt;
&lt;li&gt;70% accurate → Would you use it?&lt;/li&gt;
&lt;li&gt;90% accurate → Would you use it?&lt;/li&gt;
&lt;li&gt;100% accurate or nothing?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Building for GitLab AI Hackathon (45-day timeline). Targeting $10K prize, but more importantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning distributed systems&lt;/li&gt;
&lt;li&gt;Leveling up engineering practices&lt;/li&gt;
&lt;li&gt;Building something people actually want&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I'd rather pivot now than build something useless.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Give Feedback
&lt;/h2&gt;

&lt;p&gt;Comment below with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your role (engineer/lead/manager)&lt;/li&gt;
&lt;li&gt;Team size&lt;/li&gt;
&lt;li&gt;Answers to questions above&lt;/li&gt;
&lt;li&gt;Any other thoughts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks for your time! 🙏&lt;/p&gt;




</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
