<?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: Artem Golub</title>
    <description>The latest articles on DEV Community by Artem Golub (@corpulent).</description>
    <link>https://dev.to/corpulent</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%2F4076529%2Fc1b4afa3-9408-4f41-9d7f-ac6c5b50c0f4.jpeg</url>
      <title>DEV Community: Artem Golub</title>
      <link>https://dev.to/corpulent</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/corpulent"/>
    <language>en</language>
    <item>
      <title>When a data pipeline fails, can an AI agent explain why?</title>
      <dc:creator>Artem Golub</dc:creator>
      <pubDate>Thu, 29 Oct 2026 12:33:20 +0000</pubDate>
      <link>https://dev.to/corpulent/when-a-data-pipeline-fails-can-an-ai-agent-explain-why-266g</link>
      <guid>https://dev.to/corpulent/when-a-data-pipeline-fails-can-an-ai-agent-explain-why-266g</guid>
      <description>&lt;p&gt;A data pipeline fails. You open the logs, find the failed run, check the input file, and try to work out what happened.&lt;/p&gt;

&lt;p&gt;Did the source send bad data? Did processing fail? Is the evidence you need even available?&lt;/p&gt;

&lt;p&gt;That investigation is the part I'm exploring with &lt;strong&gt;Hermes Data Reliability&lt;/strong&gt;: a small AWS lab that uses &lt;a href="https://hermes-agent.nousresearch.com/docs" rel="noopener noreferrer"&gt;Hermes Agent, built by Nous Research&lt;/a&gt;, to investigate failed data loads and propose a next step.&lt;/p&gt;

&lt;p&gt;The goal is to give an engineer something useful to review: an explanation, the evidence behind it, and an honest account of what remains unclear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one broken file
&lt;/h2&gt;

&lt;p&gt;The example pipeline is deliberately simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Producer Lambda -&amp;gt; S3 input -&amp;gt; SQS -&amp;gt; Processor Lambda -&amp;gt; S3 output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The producer creates a JSON file containing five records. The processor checks that each record has a numeric &lt;code&gt;amount&lt;/code&gt;, doubles it, and writes the result back to S3.&lt;/p&gt;

&lt;p&gt;For the failure scenario, the producer puts this in the third record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"record_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not-a-number"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The processor rejects it during validation. Now there's a concrete failure to investigate, with a known answer we can compare the agent's explanation against.&lt;/p&gt;

&lt;p&gt;This small example keeps the investigation easy to follow. We can inspect the input, the processing attempt, and the logs without needing to understand a whole company's data platform first.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a log message to an investigation
&lt;/h2&gt;

&lt;p&gt;The workflow has three main parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, collect the signal.&lt;/strong&gt; A collector reads configured CloudWatch logs and applies matching rules defined in YAML. When a rule matches, it saves an incident in SQLite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then, investigate.&lt;/strong&gt; A separate worker picks up the incident and starts Hermes. The agent chooses which available evidence to inspect within the permissions and limits set for that investigation. For a lab run, that can include nearby logs, the input file, and saved processing-attempt details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally, write up the findings.&lt;/strong&gt; The report includes the failed stage, an explanation, uncertainty, a proposed action, and references to the evidence used.&lt;/p&gt;

&lt;p&gt;For the malformed record, a useful explanation would look something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Validation failed because the third record contains a string in &lt;code&gt;amount&lt;/code&gt;, where the processor requires a number. Correct that value at the source and review how to reprocess the affected file. The available evidence does not establish that a corrected run has succeeded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's an illustrative summary, rather than output from a measured live run. An actual report also needs references to evidence returned during its investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why keep collection separate from the agent?
&lt;/h2&gt;

&lt;p&gt;The collector continues working while Hermes is busy or unavailable. Incidents and collection progress are saved in the database, so a restart can resume from saved state.&lt;/p&gt;

&lt;p&gt;This also gives ordinary code a clear job: read the configured sources, apply the rules, and queue the matches. The agent handles the investigation after a match.&lt;/p&gt;

&lt;p&gt;There are limits on investigation time, tool calls, and attempts. Interrupted and failed attempts still count. A difficult incident shouldn't create an endless loop of model calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the agent evidence and clear boundaries
&lt;/h2&gt;

&lt;p&gt;The current investigation tools provide read-only access. Engineers decide which changes to make.&lt;/p&gt;

&lt;p&gt;Access is enforced by code outside the model. Each tool request is checked against the approved resources, time window, and remaining budget. AWS credentials stay outside the model container.&lt;/p&gt;

&lt;p&gt;The host also records which evidence each tool call returned. Before an automatic finding is accepted, its citations are checked against those records.&lt;/p&gt;

&lt;p&gt;That check has a specific purpose: confirm that the cited evidence was actually returned during this investigation. It cannot prove that the agent interpreted the evidence correctly. Reviewing the explanation still matters.&lt;/p&gt;

&lt;p&gt;Logs and file contents are treated as untrusted input, too. Text inside a log does not get to grant permissions or tell the agent to change its task.&lt;/p&gt;

&lt;h2&gt;
  
  
  “I couldn't verify that” is useful information
&lt;/h2&gt;

&lt;p&gt;An investigation can run into missing permissions, unavailable input, or incomplete results.&lt;/p&gt;

&lt;p&gt;Those limitations belong in the report. A failed read doesn't establish that a file is missing. A partial search doesn't establish that no relevant event happened.&lt;/p&gt;

&lt;p&gt;The project includes three evaluation scenarios: a malformed record, a log containing misleading instructions, and an unavailable input file. They let us examine both the diagnosis and how the agent handles evidence it should distrust or cannot inspect.&lt;/p&gt;

&lt;p&gt;These are a starting point for evaluation. Broader reliability needs more cases and measured results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the project stands
&lt;/h2&gt;

&lt;p&gt;Today, the lab focuses on explicit failures found through configured CloudWatch log matches. Detection of silent stoppages and overdue output, along with Snowflake integration, is still future work.&lt;/p&gt;

&lt;p&gt;I'm building this to make the investigation after a pipeline failure easier: follow the evidence, explain what happened, and suggest a next step an engineer can review. I'd love to shape it around the problems you actually run into.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you work with data pipelines, which recurring failure would you want an agent to investigate first?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maybe it's a file that arrives late, a schema change that breaks a load, or a job that reports success while some data never reaches its destination. I'm looking for real examples I can recreate in the lab and run the agent against.&lt;/p&gt;

&lt;p&gt;Leave a comment below or &lt;a href="https://github.com/omhq/hermes-data-reliability/issues" rel="noopener noreferrer"&gt;open a GitHub issue&lt;/a&gt;. A short description is enough to start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does your pipeline look like, and which tools does it use?&lt;/li&gt;
&lt;li&gt;What goes wrong, and how do you notice?&lt;/li&gt;
&lt;li&gt;What logs or other clues do you have, and how do you usually find the cause?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified setup or an anonymized example is perfect. I'd like to turn these into reproducible scenarios and test what the agent can explain, where it gets stuck, and what evidence would help it do better. Your recurring headache could help shape the next lab example.&lt;/p&gt;

&lt;p&gt;If this is useful to you, &lt;a href="https://github.com/omhq/hermes-data-reliability" rel="noopener noreferrer"&gt;give the project a star on GitHub&lt;/a&gt;. It helps others discover it, and I'd appreciate the support.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>dataengineering</category>
      <category>agents</category>
    </item>
    <item>
      <title>Your Coding Agent Probably Doesn’t Need a Memory SaaS</title>
      <dc:creator>Artem Golub</dc:creator>
      <pubDate>Fri, 14 Aug 2026 11:20:47 +0000</pubDate>
      <link>https://dev.to/corpulent/your-coding-agent-probably-doesnt-need-a-memory-saas-58ep</link>
      <guid>https://dev.to/corpulent/your-coding-agent-probably-doesnt-need-a-memory-saas-58ep</guid>
      <description>&lt;p&gt;I kept seeing SaaS products for coding-agent memory. The continuity I actually needed fit in one small, bounded Markdown file inside the repository.&lt;/p&gt;

&lt;p&gt;I started seeing a whole bunch of vibe-coded SaaS solutions for giving coding agents memory between sessions. Some of them are interesting, but I thought there might be a much simpler way. For this particular problem, a full-blown SaaS is not really needed.&lt;/p&gt;

&lt;p&gt;At least, not for what I was trying to solve.&lt;/p&gt;

&lt;p&gt;I did not need another account, SDK, database, synchronization layer, or service running in the background. I needed an agent to remember what it had already tried, what state the task was in, and what it should do next.&lt;/p&gt;

&lt;p&gt;So I made the smallest thing I could think of: a bounded Markdown scratchpad that lives inside the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I was actually trying to solve
&lt;/h2&gt;

&lt;p&gt;Source code preserves implementation state, but it does not preserve all the reasoning around an unfinished task.&lt;/p&gt;

&lt;p&gt;After a context reset or a handoff to another agent, the code can show what currently exists. It usually cannot explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which approaches were already attempted and why they failed.&lt;/li&gt;
&lt;li&gt;Whether an observed result came from the current code or a stale process.&lt;/li&gt;
&lt;li&gt;Which external facts were verified and which were assumptions.&lt;/li&gt;
&lt;li&gt;Which working-tree changes already belonged to the user.&lt;/li&gt;
&lt;li&gt;Which development server or process is currently relevant.&lt;/li&gt;
&lt;li&gt;What the next concrete action should be.&lt;/li&gt;
&lt;li&gt;Which discoveries might eventually deserve permanent documentation.&lt;/li&gt;
&lt;li&gt;This missing context causes agents to repeat investigations, retry failed approaches, overwrite existing work, or confidently continue from an assumption that is no longer true.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A conversation transcript can sometimes help, but it is chronological and much larger than the handful of facts required to continue a task. It may also be compacted, reset, unavailable to another agent, or full of details that no longer matter.&lt;/p&gt;

&lt;p&gt;What I needed was not long-term semantic memory. I needed reliable task continuity. Just a good handoff note.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smaller solution
&lt;/h2&gt;

&lt;p&gt;The pattern uses two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.ai_scratchpad.md holds the short-lived state for one active task.&lt;/li&gt;
&lt;li&gt;AGENTS.md tells coding agents when and how to maintain it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scratchpad is deliberately boring. It is a Markdown file in the root of the repository with four sections and a hard limit of 80 physical lines.&lt;/p&gt;

&lt;p&gt;The important part is that it does not try to remember everything. It stores only the information another agent, or the same agent after a context reset, needs to continue the next few actions safely.&lt;/p&gt;

&lt;p&gt;Check out the full gist with setup instructions here &lt;a href="https://gist.github.com/corpulent/f7fbad0a4d9cdb6a5d4f31d249a2341c" rel="noopener noreferrer"&gt;https://gist.github.com/corpulent/f7fbad0a4d9cdb6a5d4f31d249a2341c&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>development</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I kept seeing vibe-coded SaaS products offering long-term memory for coding agents and wondered whether the problem needed a full SaaS at all.

https://www.outermeasure.com/articles/coding-agent-memory-without-saas</title>
      <dc:creator>Artem Golub</dc:creator>
      <pubDate>Thu, 13 Aug 2026 15:25:14 +0000</pubDate>
      <link>https://dev.to/corpulent/i-kept-seeing-vibe-coded-saas-products-offering-long-term-memory-for-coding-agents-and-wondered-5604</link>
      <guid>https://dev.to/corpulent/i-kept-seeing-vibe-coded-saas-products-offering-long-term-memory-for-coding-agents-and-wondered-5604</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.outermeasure.com/articles/coding-agent-memory-without-saas" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Foutermeasure.s3.us-east-1.amazonaws.com%2Fimages%2Frepository-local-agent-scratchpad-flat.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.outermeasure.com/articles/coding-agent-memory-without-saas" rel="noopener noreferrer" class="c-link"&gt;
            Your Coding Agent Probably Doesn’t Need a Memory SaaS | Outermeasure
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A simple repository-local scratchpad gives coding agents reliable task continuity across context resets without another service, database, or SDK.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          outermeasure.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
