<?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: Abhishek Gupta</title>
    <description>The latest articles on DEV Community by Abhishek Gupta (@abhishek_gupta_b7379457d6).</description>
    <link>https://dev.to/abhishek_gupta_b7379457d6</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%2F4016032%2F50f7f3ae-9bed-47ce-ba9d-078ad2a3ca0e.png</url>
      <title>DEV Community: Abhishek Gupta</title>
      <link>https://dev.to/abhishek_gupta_b7379457d6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhishek_gupta_b7379457d6"/>
    <language>en</language>
    <item>
      <title>I gave my AI agent's memory a CI/CD pipeline</title>
      <dc:creator>Abhishek Gupta</dc:creator>
      <pubDate>Sun, 05 Jul 2026 18:16:09 +0000</pubDate>
      <link>https://dev.to/abhishek_gupta_b7379457d6/i-gave-my-ai-agents-memory-a-cicd-pipeline-56hf</link>
      <guid>https://dev.to/abhishek_gupta_b7379457d6/i-gave-my-ai-agents-memory-a-cicd-pipeline-56hf</guid>
      <description>&lt;h1&gt;
  
  
  🧠 I gave my AI agent's memory a CI/CD pipeline
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Building &lt;strong&gt;SOBER&lt;/strong&gt; — tests, diff, bisect, and gated deploys for a knowledge graph — for the Cognee × WeMakeDevs "Where's My Context?" hackathon.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — Your agent's memory is production infrastructure with &lt;em&gt;no tests, no diff, no rollback.&lt;/em&gt; SOBER is a &lt;code&gt;brain&lt;/code&gt; CLI + GitHub Action that wraps a &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; knowledge graph in real CI/CD: &lt;strong&gt;forget-regression tests&lt;/strong&gt; that prove a retracted secret stays gone, &lt;strong&gt;&lt;code&gt;git bisect&lt;/code&gt; for a poisoned graph&lt;/strong&gt;, and a nightly &lt;code&gt;improve()&lt;/code&gt; that opens its own pull request behind a green eval gate. Built solo, AI-assisted, and — the fun part — reviewed by a fleet of agents that found &lt;strong&gt;14 real bugs&lt;/strong&gt; in my own code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🍸 The 3 a.m. problem
&lt;/h2&gt;

&lt;p&gt;Every on-call engineer knows the feeling the hackathon is named after: it's 3 a.m., something is broken, and &lt;em&gt;nobody remembers how it got fixed last time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We solved that for &lt;strong&gt;code&lt;/strong&gt; decades ago — version control, tests, code review, rollback, canary deploys. But your AI agent's &lt;strong&gt;memory&lt;/strong&gt;, which increasingly decides what your agent knows and does, ships with none of it. It mutates in place, silently. There is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ no &lt;strong&gt;test&lt;/strong&gt; to stop a retracted secret or a stale, dangerous fact from staying recallable&lt;/li&gt;
&lt;li&gt;❌ no &lt;strong&gt;diff&lt;/strong&gt; to see what a re-ingest or an &lt;code&gt;improve()&lt;/code&gt; run changed in the graph&lt;/li&gt;
&lt;li&gt;❌ no &lt;strong&gt;bisect&lt;/strong&gt; to find &lt;em&gt;which&lt;/em&gt; ingestion poisoned the brain&lt;/li&gt;
&lt;li&gt;❌ no &lt;strong&gt;gate&lt;/strong&gt; before memory "ships" to production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;SOBER — CI/CD for Agent Brains.&lt;/strong&gt; Not memory &lt;em&gt;for&lt;/em&gt; DevOps. &lt;strong&gt;DevOps &lt;em&gt;for&lt;/em&gt; memory.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Picking the idea (the honest part)
&lt;/h2&gt;

&lt;p&gt;I didn't land on SOBER first. My initial instinct was an &lt;em&gt;incident-memory copilot&lt;/em&gt; — an on-call assistant that recalls past outages. It felt strong until I pressure-tested it against the audience:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;WeMakeDevs is a &lt;strong&gt;DevOps community&lt;/strong&gt;, so "3 a.m. incident memory" is the single most &lt;em&gt;predictable&lt;/em&gt; thing to build for them — and to Cognee's own engineers it reads as their past "Company Brain" hackathon winner with the nouns swapped.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It would have drowned in look-alikes. The winning reframe came from a different question: not &lt;em&gt;"what memory app should I build?"&lt;/em&gt; but &lt;em&gt;"what does memory-the-category still lack?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer: the entire &lt;strong&gt;operations layer&lt;/strong&gt;. Every other entry would &lt;em&gt;use&lt;/em&gt; Cognee to remember things. SOBER governs the remembering itself — and in doing so it leans hard on the one Cognee verb nobody demos: &lt;strong&gt;&lt;code&gt;forget()&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture: a brain is a &lt;em&gt;family&lt;/em&gt; of datasets
&lt;/h2&gt;

&lt;p&gt;The load-bearing design decision. Cognee's &lt;code&gt;forget()&lt;/code&gt; is scoped to a whole dataset, but I needed to retract &lt;strong&gt;one batch&lt;/strong&gt; of knowledge without disturbing the rest. So a &lt;em&gt;logical&lt;/em&gt; brain is modeled as a &lt;strong&gt;family&lt;/strong&gt; of physical datasets — one per ingestion batch (&lt;code&gt;node_set&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    K["📄 knowledge/*.md"] --&amp;gt;|brain build| ING["ingest_batch()"]
    ING --&amp;gt; C["brain__core"]
    ING --&amp;gt; R["brain__runbooks"]
    ING --&amp;gt; X["brain__retracted 🔴"]

    subgraph BRAIN["🧠 logical brain = union of the family"]
        C
        R
        X
    end

    BRAIN --&amp;gt;|"CHUNKS recall (local, no LLM)"| EV["🧪 memory CI evals"]
    BRAIN --&amp;gt;|"export + merge"| SNAP["📸 snapshot vN (JSON)"]
    SNAP --&amp;gt;|diff| DIFF["🔀 graph diff"]
    X -.-&amp;gt;|"forget(node_set='retracted')"| GONE["💨 surgically removed"]

    EV --&amp;gt; GATE{"🟢/🔴 gate"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;recall()&lt;/code&gt; and &lt;code&gt;export()&lt;/code&gt; span the whole family&lt;/strong&gt; → knowledge is found no matter which batch holds it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;forget(node_set)&lt;/code&gt; drops exactly one member&lt;/strong&gt; → surgical retraction and one-batch rollback.&lt;/li&gt;
&lt;li&gt;Membership is tracked deterministically in &lt;code&gt;snapshots/.family.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That one indirection is what makes retraction &lt;em&gt;and&lt;/em&gt; bisect-revert precise.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Capability 1 — Forget-regression tests
&lt;/h2&gt;

&lt;p&gt;A production launch code gets ingested, then retracted. The memory-CI suite proves it's gone — not just from the obvious query, but across &lt;strong&gt;paraphrase probes&lt;/strong&gt; and as &lt;strong&gt;residue in the exported graph&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's the actual run on real Cognee 1.2.2 + Gemini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brain &lt;span class="nb"&gt;test&lt;/span&gt;          &lt;span class="c"&gt;# secret still present&lt;/span&gt;
&lt;span class="go"&gt;🔴 FAIL — brain failed memory CI
   6/11 passed, 5 failed
   🔒 forbidden  "what is the launch code"                 LEAK
   🔒 forbidden  "emergency launch authorization creds"    LEAK
   🧬 structure  no_node_text_matches /BRAVO-DELTA-\d+/     residue

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brain revert brain__retracted        &lt;span class="c"&gt;# forget(node_set), memory_only&lt;/span&gt;
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brain &lt;span class="nb"&gt;test&lt;/span&gt;          &lt;span class="c"&gt;# after surgical retract&lt;/span&gt;
&lt;span class="go"&gt;🟢 PASS — brain is SOBER
   11/11 passed, 0 failed

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brain diff
&lt;span class="go"&gt;🔴 16 nodes / 32 edges removed   ← the retracted subgraph, nothing else
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A retracted fact that &lt;em&gt;stays&lt;/em&gt; retracted, proven on every change.&lt;/strong&gt; No other memory tool ships that guarantee. The very first thing I validated — before writing a single feature — was that &lt;code&gt;cognee.forget()&lt;/code&gt; genuinely removes a fact from vector recall (&lt;code&gt;recallable → []&lt;/code&gt;), not just hides it. That one green check is what made the rest worth building.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🪓 Capability 2 — &lt;code&gt;git bisect&lt;/code&gt; for a poisoned brain
&lt;/h2&gt;

&lt;p&gt;When an eval goes red, &lt;em&gt;some&lt;/em&gt; ingestion batch did it. SOBER binary-searches the batch history and pins the culprit in &lt;strong&gt;O(log n)&lt;/strong&gt; probes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brain bisect &lt;span class="nt"&gt;--failing-eval&lt;/span&gt; no-cache-flush-advice
&lt;span class="go"&gt;   probe 1: prefix_len=8  full-set sanity      red=True
   probe 2: prefix_len=5  bisectbrain__b05     red=False
   probe 3: prefix_len=7  bisectbrain__b07     red=True
   probe 4: prefix_len=6  bisectbrain__b06     red=True
&lt;/span&gt;&lt;span class="gp"&gt;   &amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; CULPRIT: bisectbrain__b06   &lt;span class="o"&gt;(&lt;/span&gt;4 probes, linear would be 8&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brain revert bisectbrain__b06     &lt;span class="c"&gt;# surgical forget → 🟢 green&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A subtle correctness point I got to appreciate: bisect is inherently a &lt;strong&gt;&lt;code&gt;forbidden&lt;/code&gt;-eval&lt;/strong&gt; concept. It finds the batch that &lt;em&gt;introduced&lt;/em&gt; a leak/poison, which stays present in every larger prefix (monotonic). A &lt;em&gt;missing&lt;/em&gt; &lt;code&gt;must_know&lt;/code&gt; fact doesn't work that way — so SOBER restricts bisect to &lt;code&gt;forbidden&lt;/code&gt; evals rather than silently returning a wrong answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌙 Capability 3 — The brain that ships itself
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cognee.improve()&lt;/code&gt; distills chat sessions into the graph — a silent mutation that can regress memory. SOBER only runs it &lt;strong&gt;behind a green gate&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant N as 🌙 nightly job
    participant CI as memory CI (evals)
    participant IM as cognee.improve()
    participant PR as pull request

    N-&amp;gt;&amp;gt;CI: run evals BEFORE
    alt already red
        CI--&amp;gt;&amp;gt;N: ❌ refuse — never distill into a broken brain
    else green
        N-&amp;gt;&amp;gt;IM: improve (distill sessions)
        IM--&amp;gt;&amp;gt;N: graph mutated
        N-&amp;gt;&amp;gt;CI: run evals AFTER
        alt regressed
            CI--&amp;gt;&amp;gt;N: 🔴 block — no PR opened, report rollback snapshot
        else still green
            N-&amp;gt;&amp;gt;PR: 📬 open PR (graph diff + before/after scores)
            PR--&amp;gt;&amp;gt;N: human merges to "deploy" the smarter brain
        end
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;before&lt;/th&gt;
&lt;th&gt;after&lt;/th&gt;
&lt;th&gt;outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 green&lt;/td&gt;
&lt;td&gt;🟢 green&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;accepted&lt;/strong&gt; — exit 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢 green&lt;/td&gt;
&lt;td&gt;🔴 red&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;blocked&lt;/strong&gt; — no PR, rollback snapshot reported (exit 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 red&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;refused&lt;/strong&gt; — never distills into a broken brain (exit 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's the &lt;strong&gt;CD&lt;/strong&gt; half of CI/CD for agent brains: memory that proposes its own upgrades, behind a green gate and a human approval.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 How it maps to Cognee
&lt;/h2&gt;

&lt;p&gt;Every memory verb is load-bearing — including the rarely-used ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SOBER capability&lt;/th&gt;
&lt;th&gt;Cognee API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build the brain from source&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cognee.add()&lt;/code&gt; + &lt;code&gt;cognee.cognify()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query for tests (keyless — local embeddings)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cognee.search(SearchType.CHUNKS, datasets=family)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snapshot / diff the graph&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cognee.export(format="json")&lt;/code&gt; → &lt;code&gt;{nodes, edges}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forget-regression / retraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cognee.forget(dataset=…, memory_only=True)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI-gated self-improvement&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cognee.improve(dataset, session_ids)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔥 The hardest part wasn't code — it was 20 requests a day
&lt;/h2&gt;

&lt;p&gt;Gemini's free tier on an unbilled key turned out to be capped at &lt;strong&gt;20 requests per day.&lt;/strong&gt; I burned through it proving the core loop live, then discovered a fresh key just gets its own tiny 20/day — whack-a-mole.&lt;/p&gt;

&lt;p&gt;So I adapted: the core forbidden-knowledge → forget loop is &lt;strong&gt;proven live&lt;/strong&gt;, and I validated the trickier bisect and improve-gate &lt;em&gt;logic&lt;/em&gt; with &lt;strong&gt;deterministic offline harnesses&lt;/strong&gt; (stubbed verdicts, zero API calls). A good reminder that the interesting engineering is often in working &lt;em&gt;around&lt;/em&gt; the constraint, not through it — and that a keyless test you can run 1,000 times is worth more than a live one you can run 20.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 Building — and reviewing — with a fleet of agents
&lt;/h2&gt;

&lt;p&gt;I built this with &lt;strong&gt;Claude Code&lt;/strong&gt; as a pair programmer, and leaned in hard. After pinning down the real Cognee API with a few validation gates, I wrote a &lt;strong&gt;frozen interface contract&lt;/strong&gt; and fanned out &lt;strong&gt;seven agents in parallel&lt;/strong&gt; — one per module (the cognee wrapper, snapshot/diff, the eval suite, bisect, the CLI, the corpus, the workflows) — plus an eighth to integrate and import-check the assembly. It caught its own wiring bugs.&lt;/p&gt;

&lt;p&gt;Then the part I'm proudest of: I turned the agents on &lt;em&gt;my own code&lt;/em&gt;. A &lt;strong&gt;six-reviewer adversarial review&lt;/strong&gt; — each finding re-verified by a skeptic that re-read the actual code before it counted — surfaced &lt;strong&gt;14 confirmed bugs, zero false positives&lt;/strong&gt;, deduping to 5 real root issues. The two nastiest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- brain.improve(dataset="brain")          # targets the always-EMPTY base dataset
&lt;/span&gt;&lt;span class="gi"&gt;+ for member in list_family(dataset):      # spans brain__core, brain__runbooks, …
+     await cognee.improve(dataset=member) # the self-improve feature was a live no-op!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- glob("snapshots/brain__*")   # per-batch snapshot files that are NEVER created
&lt;/span&gt;&lt;span class="gi"&gt;+ read(".family.json")         # the registry that actually records the batches
&lt;/span&gt;                               # → `brain bisect` was dying every time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both were in paths I'd only proven &lt;em&gt;offline&lt;/em&gt;, so the stubs had masked them. I fixed all five, re-verified keyless, and pushed. &lt;strong&gt;Being able to adversarially review your own work — and have it find real bugs — is a genuine superpower.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Per the hackathon's disclosure rules: AI assistance was used throughout; every result I call "proven" was executed against real Cognee + Gemini, not generated.)&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🗺️ What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cognee Cloud canary deploys&lt;/strong&gt; — after a green &lt;code&gt;brain ci&lt;/code&gt;, &lt;code&gt;push()&lt;/code&gt; the brain to Cognee Cloud and &lt;code&gt;serve()&lt;/code&gt; it to a slice of traffic, promoting or rolling back on live feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-process snapshot restore&lt;/strong&gt; so a regressing &lt;code&gt;improve()&lt;/code&gt; auto-rolls-back instead of only blocking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More eval kinds&lt;/strong&gt; — semantic contradiction detection, freshness/TTL checks, per-node-set coverage gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the thesis is already standing: &lt;strong&gt;your agent's memory is production infrastructure, and now it can be tested, diffed, bisected, gated, and deployed like any other build artifact.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your brain can't merge a regression anymore.&lt;/p&gt;




&lt;p&gt;
  &lt;strong&gt;⭐ Repo:&lt;/strong&gt; &lt;em&gt;https://github.com/wiz-abhi/SOBER&lt;/em&gt; &amp;nbsp;·&amp;nbsp; Built on &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; for &lt;a href="https://www.wemakedevs.org/hackathons/cognee" rel="noopener noreferrer"&gt;The Hangover Part AI&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cognee</category>
      <category>devops</category>
      <category>python</category>
    </item>
  </channel>
</rss>
