<?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: Esa Data</title>
    <description>The latest articles on DEV Community by Esa Data (@esadata).</description>
    <link>https://dev.to/esadata</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%2F4135439%2F630d7e4d-0926-4c78-b8b8-a8d66f0b5c71.jpeg</url>
      <title>DEV Community: Esa Data</title>
      <link>https://dev.to/esadata</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/esadata"/>
    <language>en</language>
    <item>
      <title>Building a Real-Time E-Commerce Support Platform with an AI Agent Team</title>
      <dc:creator>Esa Data</dc:creator>
      <pubDate>Sun, 25 Oct 2026 14:55:55 +0000</pubDate>
      <link>https://dev.to/esadata/building-a-real-time-e-commerce-support-platform-with-an-ai-agent-team-4lb9</link>
      <guid>https://dev.to/esadata/building-a-real-time-e-commerce-support-platform-with-an-ai-agent-team-4lb9</guid>
      <description>&lt;p&gt;Ever abandoned a shopping cart because you couldn't quickly ask, "When will my package arrive?" Industry averages put cart abandonment at around &lt;strong&gt;70%&lt;/strong&gt;, and slow answers are a major cause: contact forms, ticket portals, and emails that get a reply hours later.&lt;/p&gt;

&lt;p&gt;That problem led me to build &lt;strong&gt;Aura Gear&lt;/strong&gt;, a real-time customer support platform for e-commerce. It's also an experiment in how an engineer and a team of AI agents can build a complete system together, from specification to operations.&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/ketut-garjita" rel="noopener noreferrer"&gt;
        ketut-garjita
      &lt;/a&gt; / &lt;a href="https://github.com/ketut-garjita/aidevtools" rel="noopener noreferrer"&gt;
        aidevtools
      &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;⚡ Aura Gear: Real-Time E-Commerce Customer Support Platform&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/ketut-garjita/aidevtools/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/ketut-garjita/aidevtools/actions/workflows/ci-cd.yml/badge.svg" alt="CI/CD Pipeline"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/downloads/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/93a33cfc2339ec3fa9be792576576fbaafc42b0c7031285662b02f3aca1e1c59/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31302b2d626c75652e737667" alt="Python: 3.10+"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An asynchronous, ultra-low latency real-time customer support platform built for modern e-commerce storefronts. Features an embeddable customer concierge widget with instant order tracking and a multi-pane support agent command center.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛍️ Storefront &amp;amp; Customer Chat&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ketut-garjita/aidevtools/assets/aura-gear.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fketut-garjita%2Faidevtools%2FHEAD%2Fassets%2Faura-gear.png" alt="Aura Gear"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 Evaluation Rubric Alignment Matrix (12 Criteria / 24 Points)&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&lt;/th&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Target Score&lt;/th&gt;
&lt;th&gt;Evidence / Deliverable File&lt;/th&gt;
&lt;th&gt;Summary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Problem Description&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 / 2&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ketut-garjita/aidevtools#1-problem-description" rel="noopener noreferrer"&gt;README.md&lt;/a&gt;, &lt;a href="https://github.com/ketut-garjita/aidevtools/product-spec.md" rel="noopener noreferrer"&gt;product-spec.md&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Clearly describes problem, shopper/agent personas, and expected behavior.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Product Specification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 / 2&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ketut-garjita/aidevtools/product-spec.md" rel="noopener noreferrer"&gt;product-spec.md&lt;/a&gt;, &lt;a href="https://github.com/ketut-garjita/aidevtools/openapi.yaml" rel="noopener noreferrer"&gt;openapi.yaml&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Full specifications with OpenAPI contract and public task tracker with acceptance criteria.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Agent Team Specification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 / 2&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ketut-garjita/aidevtools/.agents/agents.md" rel="noopener noreferrer"&gt;.agents/agents.md&lt;/a&gt;, &lt;a href="https://github.com/ketut-garjita/aidevtools#3-agent-team-specification" rel="noopener noreferrer"&gt;README.md&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Defined specialized agent team (&lt;code&gt;@pm&lt;/code&gt;, &lt;code&gt;@engineer&lt;/code&gt;, &lt;code&gt;@qa&lt;/code&gt;, &lt;code&gt;@devops&lt;/code&gt;, &lt;code&gt;@specialist&lt;/code&gt;, &lt;code&gt;@oncall-responder&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Context Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 / 2&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ketut-garjita/aidevtools/AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt;, &lt;a href="https://github.com/ketut-garjita/aidevtools/docs/" rel="noopener noreferrer"&gt;docs/&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Master governance file pointing to modular docs (architecture, extension pack, permissions, runbook).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/ketut-garjita/aidevtools" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&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%2F0eb14ux50l385ey614hb.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%2F0eb14ux50l385ey614hb.png" alt="Aura Gear" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Online shoppers usually need fast answers on three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parcel tracking and carrier timelines&lt;/li&gt;
&lt;li&gt;Return and exchange policies&lt;/li&gt;
&lt;li&gt;Sizing, specifications, and inventory availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aura Gear addresses this with two components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Customer concierge widget&lt;/strong&gt;: an embeddable chat for online stores with instant order tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent command center&lt;/strong&gt;: a multi-pane dashboard for the support team.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Persona&lt;/th&gt;
&lt;th&gt;Needs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shopper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Instant answers with zero friction, order lookup without leaving the page, and the option to talk to a human agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Support agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Many concurrent chats, customers' typing previews, one-click canned macros, and instant order context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Architecture at a Glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: a lightweight glassmorphic UI (under 150KB) with no build step&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Python 3.10+ with FastAPI and Uvicorn, using native asynchronous WebSockets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt;: a thread-safe asynchronous chat store for conversations, messages, and agent assignments, with session recovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: multi-stage Docker image on Google Cloud Run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run it locally with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 app_build/server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Built by an AI Agent Team
&lt;/h2&gt;

&lt;p&gt;The project was designed, built, and verified by six agent personas, each with a specific role:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Deliverables&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@pm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Product Manager&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;product-spec.md&lt;/code&gt;, &lt;code&gt;openapi.yaml&lt;/code&gt; API contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@engineer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full-stack engineer&lt;/td&gt;
&lt;td&gt;FastAPI backend, WebSocket manager, UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@qa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;QA engineer&lt;/td&gt;
&lt;td&gt;Unit and integration tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@devops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Docker, CI/CD, Cloud Run deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@specialist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agent Ops&lt;/td&gt;
&lt;td&gt;MCP server, hooks, agent extension pack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@oncall-responder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Incident responder&lt;/td&gt;
&lt;td&gt;Automated response when alerts fire&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each agent has its own &lt;strong&gt;skill&lt;/strong&gt; (an instruction file) under &lt;code&gt;.agents/skills/&lt;/code&gt;, and a single &lt;code&gt;startcycle.md&lt;/code&gt; workflow orchestrates the whole cycle with a &lt;strong&gt;human approval gate&lt;/strong&gt;. Humans keep the final say.&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%2Fvyn1pyes0701h508krii.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%2Fvyn1pyes0701h508krii.png" alt="Diagram of the Agent Workflow" width="692" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Management: Keeping Agents on Track
&lt;/h2&gt;

&lt;p&gt;AI agents perform well when their context is clear, so the repo uses modular documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;: the master governance file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture.md&lt;/code&gt;: architecture and sequence diagrams&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/permissions.md&lt;/code&gt;: tool execution boundaries, filesystem safety, credential isolation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;security/ai-data-policy.md&lt;/code&gt;: telemetry policy (no PII or credentials)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ops/runbook.md&lt;/code&gt;: diagnosis and alerting guide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well-organized documentation is the agent's working memory. The clearer the boundaries, the more dependable the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing and CI/CD
&lt;/h2&gt;

&lt;p&gt;One command runs all tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; unittest discover tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit tests&lt;/strong&gt;: order ID normalization (&lt;code&gt;#ORD-1001&lt;/code&gt;, &lt;code&gt;ord-1001&lt;/code&gt;, &lt;code&gt;1001&lt;/code&gt;), the order catalog, and the chat store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration tests&lt;/strong&gt;: health endpoint, order lookup, 404 handling, and the macro endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The GitHub Actions pipeline has three stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Push / Pull Request
        |
        v
 Stage 1: CI     -&amp;gt; flake8 + unit/integration tests
        |
        v
 Stage 2: CD Dev -&amp;gt; build container, deploy &amp;amp; verify dev
        |
        v  (manual approval)
 Stage 3: CD Prod -&amp;gt; workflow_dispatch, promote to production
                     + probe Cloud Run health URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production deployment sits behind a manual approval gate. Automation can be aggressive in dev, but production calls for a conscious decision.&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%2Fg6440ob757embhzzr4y2.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%2Fg6440ob757embhzzr4y2.png" alt="screenshot of the manual production deploy" width="799" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerting on Real User Impact
&lt;/h2&gt;

&lt;p&gt;Instead of generic CPU or RAM graphs, alerts target what users actually feel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket drop rate&lt;/strong&gt; above 5% within 3 minutes (shoppers losing connection)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p95 latency&lt;/strong&gt; above 500ms (chat feels laggy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5xx error rate&lt;/strong&gt; above 2% on &lt;code&gt;/api/orders&lt;/code&gt; (order tracking failing)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every WebSocket connection carries a &lt;code&gt;trace_id&lt;/code&gt; so logs can be correlated easily, and telemetry never includes personal data, payment details, or credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  The On-Call Agent
&lt;/h2&gt;

&lt;p&gt;When an alert fires, &lt;code&gt;@oncall-responder&lt;/code&gt; wakes up on its own:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parses the alert webhook&lt;/li&gt;
&lt;li&gt;Correlates error logs via &lt;code&gt;trace_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cleans up memory from orphaned sessions&lt;/li&gt;
&lt;li&gt;Restarts ASGI workers if they become unresponsive&lt;/li&gt;
&lt;li&gt;Verifies recovery with &lt;code&gt;ops/health-check.sh&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where platform engineering meets AI engineering: a well-written runbook can become the "brain" of an operational agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The demo is not kept running permanently. You can deploy it yourself using the instructions in the repo.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec first, code second.&lt;/strong&gt; An OpenAPI contract and a task tracker with acceptance criteria keep agents focused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear roles make agents more reliable.&lt;/strong&gt; One agent, one responsibility, each with its own skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep humans in the loop.&lt;/strong&gt; Approval gates in the workflow and in production deploys preserve control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert on user impact&lt;/strong&gt;, not just infrastructure numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runbooks are AI assets.&lt;/strong&gt; Documented procedures can be executed directly by agents.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Aura Gear is more than a chat app. It's an exercise in building a complete software delivery lifecycle with AI agents: specification, code, tests, containers, CI/CD, observability, and incident response.&lt;/p&gt;

&lt;p&gt;If you're working at the intersection of data/platform engineering and AI engineering, I'd love to hear how you structure agent roles and guardrails in your own projects. Share your approach in the comments, and a ⭐ on the repo is always appreciated.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aiagents</category>
      <category>devops</category>
      <category>fastapi</category>
    </item>
    <item>
      <title>From Telemetry to Automated Incident Response: My DevOps &amp; Observability Journey</title>
      <dc:creator>Esa Data</dc:creator>
      <pubDate>Sat, 03 Oct 2026 03:49:54 +0000</pubDate>
      <link>https://dev.to/esadata/from-telemetry-to-automated-incident-response-my-devops-observability-journey-2ob5</link>
      <guid>https://dev.to/esadata/from-telemetry-to-automated-incident-response-my-devops-observability-journey-2ob5</guid>
      <description>&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%2Fy2byhniwd79r1zlxj1x7.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%2Fy2byhniwd79r1zlxj1x7.png" alt="Observability and Incident Response Pipeline" width="800" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Description: A hands-on learning journey building observability and automated incident response into a FastAPI order-tracking application using OpenTelemetry, Prometheus, Loki, Tempo, Grafana, and Codex CLI.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Telemetry to Automated Incident Response
&lt;/h2&gt;

&lt;p&gt;As part of the &lt;strong&gt;DataTalksClub AI Dev Tools Zoomcamp&lt;/strong&gt;, I worked on a small but practical challenge: turning a simple FastAPI application into an observable system with automated incident response.&lt;/p&gt;

&lt;p&gt;The project started as a basic &lt;strong&gt;Order Tracker&lt;/strong&gt; application backed by SQLite.&lt;/p&gt;

&lt;p&gt;By the end, it had evolved into a system that could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;collect &lt;strong&gt;metrics, logs, and traces&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;visualize telemetry in &lt;strong&gt;Grafana&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;detect application errors through &lt;strong&gt;alerting&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;send incidents to an &lt;strong&gt;incident-response service&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;provide evidence for investigation&lt;/li&gt;
&lt;li&gt;trigger a coding agent to investigate and remediate an issue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most valuable lesson for me was that observability is not just about collecting data.&lt;/p&gt;

&lt;p&gt;It is about connecting &lt;strong&gt;detection → investigation → remediation → verification&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;A basic application can work perfectly during development and still fail in production.&lt;/p&gt;

&lt;p&gt;For an order-tracking API, a failure might look simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/orders/express-1002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns a server error.&lt;/p&gt;

&lt;p&gt;Without observability, the workflow often becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Something is broken
        ↓
Check application logs
        ↓
Search for the error
        ↓
Try to reproduce it
        ↓
Find the problematic code
        ↓
Apply a fix
        ↓
Restart the application
        ↓
Test again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works, but it becomes increasingly difficult as the system grows.&lt;/p&gt;

&lt;p&gt;I wanted to build a workflow where telemetry could help connect these steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;The final architecture introduced several components:&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%2Fy2byhniwd79r1zlxj1x7.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%2Fy2byhniwd79r1zlxj1x7.png" alt="Observability and Incident Response Pipeline" width="800" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This architecture separates telemetry collection, storage, visualization, alerting, and incident response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instrumenting the Application
&lt;/h3&gt;

&lt;p&gt;The first step was adding OpenTelemetry instrumentation to the FastAPI application.&lt;/p&gt;

&lt;p&gt;I wanted each order lookup to produce useful telemetry, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP route&lt;/li&gt;
&lt;li&gt;HTTP status code&lt;/li&gt;
&lt;li&gt;request information&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;traces&lt;/li&gt;
&lt;li&gt;request metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/orders/standard-1001
→ 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/orders/standard-1002
→ 404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part was not simply knowing that a request happened.&lt;/p&gt;

&lt;p&gt;The telemetry needed enough context to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What endpoint failed, what was the HTTP status, and what happened during the request?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Adding the Observability Stack
&lt;/h3&gt;

&lt;p&gt;The next step was connecting the application to an observability stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenTelemetry Collector&lt;/strong&gt; — receives and routes telemetry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus&lt;/strong&gt; — metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loki&lt;/strong&gt; — logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tempo&lt;/strong&gt; — traces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana&lt;/strong&gt; — visualization and alerting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The OpenTelemetry Collector became the central telemetry pipeline.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
    │
    │ OTLP
    ▼
OpenTelemetry Collector
    │
    ├── Metrics → Prometheus
    │
    ├── Logs    → Loki
    │
    └── Traces  → Tempo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grafana then provides a single interface for exploring these signals.&lt;/p&gt;

&lt;p&gt;This was one of the important lessons from the project:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Metrics tell you that something is happening.&lt;br&gt;
Logs help explain what happened.&lt;br&gt;
Traces help show where it happened.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using the three together provides much more useful operational context than relying on a single signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grafana Alerting
&lt;/h3&gt;

&lt;p&gt;After telemetry was available, I configured Grafana alerting for server-side failures.&lt;/p&gt;

&lt;p&gt;The goal was to detect &lt;strong&gt;5xx responses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A 404 response such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/orders/standard-1002
→ 404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;should not trigger the 5xx incident workflow.&lt;/p&gt;

&lt;p&gt;This distinction was useful because it forced me to think about alert conditions rather than simply alerting on every failed request.&lt;/p&gt;

&lt;p&gt;The alert also needed to provide enough information for the next stage of the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automated Incident Response
&lt;/h3&gt;

&lt;p&gt;The next step was adding a dedicated incident-response service.&lt;/p&gt;

&lt;p&gt;The service exposes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /alerts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Grafana sends an alert, the responder stores the incident information and gathers useful evidence.&lt;/p&gt;

&lt;p&gt;The idea is to transform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Grafana Alert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Incident
├── endpoint
├── status
├── logs
├── traces
└── investigation context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a bridge between observability and automated remediation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting an AI Coding Agent
&lt;/h3&gt;

&lt;p&gt;The most interesting part of the exercise was connecting the incident workflow to a coding agent.&lt;/p&gt;

&lt;p&gt;Instead of simply notifying a developer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚨 500 error detected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the system can provide the coding agent with context about the incident.&lt;/p&gt;

&lt;p&gt;The intended workflow becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5xx detected
     ↓
Grafana alert
     ↓
Incident-response service
     ↓
Collect evidence
     ↓
Coding agent investigates
     ↓
Identify root cause
     ↓
Apply fix
     ↓
Restart application
     ↓
Verify behavior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changes the role of AI from simply generating code to participating in an operational workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding the Bug
&lt;/h3&gt;

&lt;p&gt;The final exercise intentionally exposed a bug in the Express order lookup.&lt;/p&gt;

&lt;p&gt;The problematic implementation calculated the estimated delivery date using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;estimated_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;placed_at&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;placed_at&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks reasonable at first glance.&lt;/p&gt;

&lt;p&gt;However, it assumes that the resulting day exists in the same month.&lt;/p&gt;

&lt;p&gt;For an order created near the end of a month, that assumption can fail.&lt;/p&gt;

&lt;p&gt;The fix was to use date arithmetic instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;estimated_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;placed_at&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows Python's datetime implementation to correctly handle month boundaries.&lt;/p&gt;

&lt;p&gt;The important part was not only finding the line of code.&lt;/p&gt;

&lt;p&gt;The observability and incident-response workflow provided the path from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP failure
    ↓
Telemetry
    ↓
Alert
    ↓
Incident evidence
    ↓
Root-cause investigation
    ↓
Code change
    ↓
Verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What I Learned
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Observability is more than logging
&lt;/h4&gt;

&lt;p&gt;Before this project, it was easy to think of observability as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Add some logs."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project changed that perspective.&lt;/p&gt;

&lt;p&gt;A useful observability system combines multiple signals and makes them actionable.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Alerts need context
&lt;/h4&gt;

&lt;p&gt;An alert saying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Something went wrong
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not particularly useful.&lt;/p&gt;

&lt;p&gt;An actionable incident should provide enough context to start an investigation.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endpoint
HTTP status
Logs
Trace
Time window
Dashboard context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Automation should be connected to verification
&lt;/h4&gt;

&lt;p&gt;Automatically changing code is not enough.&lt;/p&gt;

&lt;p&gt;A remediation workflow should also verify that the application works after the change.&lt;/p&gt;

&lt;p&gt;That makes the workflow closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Detect → Investigate → Fix → Verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Detect → Fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. AI agents need operational context
&lt;/h4&gt;

&lt;p&gt;A coding agent becomes much more useful when it receives evidence from the system instead of being asked to investigate blindly.&lt;/p&gt;

&lt;p&gt;Telemetry can provide the context needed for the agent to understand what actually happened.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technology Stack
&lt;/h3&gt;

&lt;p&gt;The project brought several tools together:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telemetry&lt;/td&gt;
&lt;td&gt;OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telemetry Pipeline&lt;/td&gt;
&lt;td&gt;OpenTelemetry Collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metrics&lt;/td&gt;
&lt;td&gt;Prometheus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;Loki&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traces&lt;/td&gt;
&lt;td&gt;Tempo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visualization&lt;/td&gt;
&lt;td&gt;Grafana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;Docker / Docker Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-assisted remediation&lt;/td&gt;
&lt;td&gt;Codex CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;The completed workflow was validated through the homework tasks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Scenario&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;Q1&lt;/td&gt;
&lt;td&gt;Application health check&lt;/td&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q2&lt;/td&gt;
&lt;td&gt;Existing order lookup&lt;/td&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3&lt;/td&gt;
&lt;td&gt;Missing order lookup&lt;/td&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4&lt;/td&gt;
&lt;td&gt;5xx alert behavior&lt;/td&gt;
&lt;td&gt;Normal for 404&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5&lt;/td&gt;
&lt;td&gt;Incident-response workflow&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q6&lt;/td&gt;
&lt;td&gt;Express order incident&lt;/td&gt;
&lt;td&gt;Root cause identified and fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important outcome was not just that each individual component worked.&lt;/p&gt;

&lt;p&gt;The complete workflow worked as a chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Takeaway
&lt;/h3&gt;

&lt;p&gt;The biggest lesson from this project was that &lt;strong&gt;observability becomes much more valuable when it is connected to action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A mature workflow can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
     ↓
Telemetry
     ↓
Observability
     ↓
Alerting
     ↓
Incident Response
     ↓
AI-assisted Investigation
     ↓
Remediation
     ↓
Verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This project gave me hands-on experience connecting these pieces together rather than learning them as isolated technologies.&lt;/p&gt;

&lt;p&gt;For me, that's the real value of &lt;strong&gt;Learning in Public&lt;/strong&gt;: documenting not only what I built, but also the problems I encountered, the root causes I found, and what changed in my understanding along the way.&lt;/p&gt;




&lt;h3&gt;
  
  
  Acknowledgments
&lt;/h3&gt;

&lt;p&gt;This project was completed as part of the &lt;strong&gt;DataTalksClub AI Dev Tools Zoomcamp — Homework 4: DevOps and Observability for AI-Built Apps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to the DataTalksClub community for creating practical exercises that connect software development, DevOps, observability, and AI-assisted engineering.&lt;/p&gt;




&lt;p&gt;Github Repository: &lt;a href="https://github.com/ketut-garjita/order-tracker-v2" rel="noopener noreferrer"&gt;order-tracker-v2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>observability</category>
      <category>opentelemetry</category>
      <category>ai</category>
    </item>
    <item>
      <title>Agent Relay v2</title>
      <dc:creator>Esa Data</dc:creator>
      <pubDate>Mon, 21 Sep 2026 10:44:14 +0000</pubDate>
      <link>https://dev.to/esadata/agent-relay-v2-28aa</link>
      <guid>https://dev.to/esadata/agent-relay-v2-28aa</guid>
      <description>&lt;h2&gt;
  
  
  From SQLite to Kubernetes: Building a Test-Gated CI/CD Pipeline for a Task Relay Service
&lt;/h2&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%2Fyn7apvrukhlapq4d7emn.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%2Fyn7apvrukhlapq4d7emn.png" alt="Agent-Relay v2 Architecture" width="652" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I recently completed an engineering exercise that started as a small FastAPI + SQLite application and gradually evolved into a containerized, Kubernetes-deployed service with a full CI/CD pipeline.&lt;br&gt;
The project is Agent Relay — a task relay service for registering agents, delivering tasks, tracking claims, and recording results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The evolution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLite → PostgreSQL → Docker → Kubernetes (Kind) → GitHub Actions CI/CD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What made this interesting wasn't just "getting it running" — it was watching each layer expose a new class of problem that the previous layer didn't have to deal with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I implemented and verified along the way&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Agent registration and authentication&lt;br&gt;
• At-least-once task delivery&lt;br&gt;
• Lease-based task claims&lt;br&gt;
• Worker heartbeats&lt;br&gt;
• Task recovery after worker failure&lt;br&gt;
• Idempotent terminal requests&lt;br&gt;
• PostgreSQL persistence&lt;br&gt;
• Docker containerization&lt;br&gt;
• Kubernetes Deployment, Service, Secret, and PVC&lt;br&gt;
• Automated pytest verification&lt;br&gt;
• Git SHA-based Docker image tagging&lt;br&gt;
• Test-gated CI/CD&lt;br&gt;
• End-to-end deployment verification&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson that mattered most&lt;/strong&gt;&lt;br&gt;
A successful Kubernetes rollout does not mean an application is actually working. kubectl rollout status can go green while the app underneath is silently broken — a bad config, a missing secret, a dependency that never connected.&lt;br&gt;
So the pipeline doesn't stop at "the pods are Running." After deployment, it port-forwards the service and runs an application-level check against the dashboard — the same kind of check a human would do by opening the page and looking at it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pipeline, accurately&lt;/strong&gt;&lt;br&gt;
My first pass at diagramming this pipeline drew pytest, Docker build, and Kubernetes deployment as three parallel branches. That's not what actually happens. The real pipeline is sequential and test-gated: nothing gets built or deployed unless the tests pass first.&lt;/p&gt;

&lt;p&gt;Developer&lt;br&gt;
   ↓&lt;br&gt;
Git Repository (push)&lt;br&gt;
   ↓&lt;br&gt;
GitHub Actions&lt;br&gt;
   ↓&lt;br&gt;
job: test&lt;br&gt;
   ├── setup Python 3.11 + uv&lt;br&gt;
   ├── Postgres 16-alpine (service container)&lt;br&gt;
   └── uv run pytest -q&lt;br&gt;
   ↓  (needs: test → only proceeds if tests pass)&lt;br&gt;
job: build-and-deploy&lt;br&gt;
   ├── Docker build (image tagged with Git SHA)&lt;br&gt;
   └── deploy to Kind cluster&lt;br&gt;
          ├── kubectl apply -f k8s/&lt;br&gt;
          ├── kubectl set image&lt;br&gt;
          └── rollout status&lt;br&gt;
                ↓&lt;br&gt;
        Agent Relay (FastAPI service, incl. dashboard)&lt;br&gt;
                ↓&lt;br&gt;
        Verification: port-forward + curl → dashboard check&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters beyond one project&lt;/strong&gt;&lt;br&gt;
The instinct to treat "deployed" as "done" is exactly the instinct that breaks pipelines at scale. Whether it's a Kubernetes rollout or a data/ML pipeline, the pattern is the same: infrastructure-level success (pod is Running, DAG task is green) is not application-level success (the thing actually does what it's supposed to do). Closing that gap with a real, purpose-built check — not just a health probe — is what turns "it deployed" into "it works."&lt;/p&gt;

&lt;p&gt;I'm currently exploring how these same engineering principles — test gating, staged evolution, verifying at the application level rather than the infrastructure level — apply to larger Data Engineering and AI/LLM systems, where the failure modes are often even less visible than a crashed pod.&lt;/p&gt;

&lt;p&gt;The repository contains the implementation, Kubernetes manifests, Docker configuration, automated tests, and the CI/CD workflow.&lt;/p&gt;

&lt;p&gt;GitHub repo: &lt;a href="https://github.com/ketut-garjita/agent-relay" rel="noopener noreferrer"&gt;https://github.com/ketut-garjita/agent-relay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cicd</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
  </channel>
</rss>
