<?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: Mārtiņš Veiss</title>
    <description>The latest articles on DEV Community by Mārtiņš Veiss (@mrveiss).</description>
    <link>https://dev.to/mrveiss</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%2F3867783%2Fb7397987-7baa-4c63-b090-414707e4daa6.jpg</url>
      <title>DEV Community: Mārtiņš Veiss</title>
      <link>https://dev.to/mrveiss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mrveiss"/>
    <language>en</language>
    <item>
      <title>Weekly Update: ✨ security(secrets): ask the secret's own scope, not just th</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:08:50 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-securitysecrets-ask-the-secrets-own-scope-not-just-th-4ki4</link>
      <guid>https://dev.to/mrveiss/weekly-update-securitysecrets-ask-the-secrets-own-scope-not-just-th-4ki4</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ security(secrets): ask the secret's own scope, not just the vault grant (#16982) (#17772)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 security(secrets): ask the secret's own scope, not just the vault grant (#16982) (#17772)&lt;/li&gt;
&lt;li&gt;🔧 config(tts): one spelling per side of the boundary, and the inventory port configured nothing…&lt;/li&gt;
&lt;li&gt;🔧 chore(deps-dev): bump the oxlint group in /autobot-frontend with 2 updates (#17705)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +2&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-23T09:08:41.447337Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-23T09:08:41.447337Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>Weekly Update: 🐛 fix(rag): preserve per-view provenance and multiplicity th</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:15:12 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-fixrag-preserve-per-view-provenance-and-multiplicity-th-1ff5</link>
      <guid>https://dev.to/mrveiss/weekly-update-fixrag-preserve-per-view-provenance-and-multiplicity-th-1ff5</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: 🐛 fix(rag): preserve per-view provenance and multiplicity through RRF fusion (#17207)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 fix(rag): preserve per-view provenance and multiplicity through RRF fusion (#17207) (PR #17216)&lt;/li&gt;
&lt;li&gt;🔧 fix(security): close an arbitrary file write and two path-injection holes (#17300) (#17301)&lt;/li&gt;
&lt;li&gt;🔧 fix(pricing): migrate LLM cost tracking off hardcoded price tables (#16230, #16233, #16316) (#17187)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +3&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-16T09:15:07.621043Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-16T09:15:07.621043Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>Weekly Update: ✨ feat(mcp): admin-configured external MCP server bridge</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 16 Sep 2026 09:01:03 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-featmcp-admin-configured-external-mcp-server-bridge-1b46</link>
      <guid>https://dev.to/mrveiss/weekly-update-featmcp-admin-configured-external-mcp-server-bridge-1b46</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ feat(mcp): admin-configured external MCP server bridge
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✨ feat(mcp): admin-configured external MCP server bridge (PR #16458)&lt;/li&gt;
&lt;li&gt;🐛 fix(mcp): rename autobot-backend/mcp/ off the name it shadows (#16449) (PR #16454)&lt;/li&gt;
&lt;li&gt;📚 docs(adr): supersede ADR-001's fixed VM count with role-separation placement (#15194)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +3&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-09T09:00:57.969904Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-09T09:00:57.969904Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>The one you reported is gone. This one is still up.</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Mon, 14 Sep 2026 20:03:55 +0000</pubDate>
      <link>https://dev.to/mrveiss/the-one-you-reported-is-gone-this-one-is-still-up-4pc4</link>
      <guid>https://dev.to/mrveiss/the-one-you-reported-is-gone-this-one-is-still-up-4pc4</guid>
      <description>&lt;p&gt;On 2026-08-17 I reported &lt;code&gt;Leutenegger/book-to-skill&lt;/code&gt; to GitHub Trust &amp;amp; Safety: TLS&lt;br&gt;
verification disabled at import, a beacon to a Cloudflare Worker, eight wallet-extension&lt;br&gt;
IDs enumerated, Ledger data archived and uploaded, and a Windows EXE launched via&lt;br&gt;
PowerShell with &lt;code&gt;ExecutionPolicy Bypass&lt;/code&gt;. It was impersonating&lt;br&gt;
&lt;a href="https://github.com/virgiliojr94/book-to-skill" rel="noopener noreferrer"&gt;book-to-skill&lt;/a&gt; — a genuinely useful,&lt;br&gt;
26,868-star project (PDFs into Claude Skills) — riding on its sudden popularity to get&lt;br&gt;
installs. GitHub actioned it on 2026-08-23. The repository and the entire account now&lt;br&gt;
return 404.&lt;/p&gt;

&lt;p&gt;That should be the end of it. It isn't. On 2026-08-29, diffing every repository sharing&lt;br&gt;
the project's name against the real upstream tree turned up a second operator, still live&lt;br&gt;
at the time of writing.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is in the archive
&lt;/h2&gt;

&lt;p&gt;Both of the impersonator's repositories ship the same 487,256-byte zip. One path is&lt;br&gt;
&lt;code&gt;frond/book_to_skill_3.8.zip&lt;/code&gt;, the other &lt;code&gt;docs/v1.7.zip&lt;/code&gt; — byte-identical, three members,&lt;br&gt;
matching timestamps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Application.cmd&lt;/code&gt;&lt;/strong&gt; — 24 bytes. Its entire contents: &lt;code&gt;start utils.exe cert.txt&lt;/code&gt;. One
file runs the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;utils.exe&lt;/code&gt;&lt;/strong&gt; — 759,808 bytes, a PE executable. Not malicious on its own: the embedded
strings identify an unmodified LuaJIT 2.1, built from the Defold project's pipeline.
It's here purely to execute the payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;cert.txt&lt;/code&gt;&lt;/strong&gt; — 183,728 bytes. Not a certificate. Obfuscated Lua source, opening
&lt;code&gt;local Tq=function(i)local k,Z=i[#i],""…&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technique is living off a clean binary: ship a legitimate interpreter that no scanner&lt;br&gt;
objects to, keep the actual logic in a data file with a reassuring extension, and let a&lt;br&gt;
24-byte batch file put them together. A file named &lt;code&gt;cert.txt&lt;/code&gt; that is executable Lua,&lt;br&gt;
sitting next to an interpreter, inside a repository named after a widely-installed&lt;br&gt;
developer tool, is not an accident.&lt;/p&gt;

&lt;p&gt;SHA-256, for anyone who wants to pivot on them in VirusTotal or MalwareBazaar (GitHub&lt;br&gt;
itself can't be searched by hash — more on that below):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application.cmd  2fd3cb8aa174b29406cd39f62369603891840e90bb65cd8aaf4fb3e32a28f166
cert.txt         9303b32a3fdf241d38aaaaff46ef9fdb0800b678a4ea2be4bf35d475610eb152
utils.exe        e227d47facf0e2f5b9e5c54a23a86b31272696b64bbbb9932a31fe06973677bd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Two doors, one payload
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 repository&lt;/strong&gt; — &lt;code&gt;orestedevoted590/book-to-skill&lt;/code&gt;, created 30 July. No source code.
A one-line README and the archive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 Pages site&lt;/strong&gt; — &lt;code&gt;orestedevoted590.github.io&lt;/code&gt;, a published site with real marketing
copy, a Download badge, and Windows-only system requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 inbound links&lt;/strong&gt; — no stars, no forks, no followers, not in GitHub's code index.
Nothing points at either repo or the site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;90 other name-copies checked&lt;/strong&gt; — every exact-name repository diffed against the
upstream tree. One other shipped an archive at all; it turned out to be markdown and
YAML, and benign.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Pages site is the more dangerous of the two. It reads as a legitimate product page —&lt;br&gt;
&lt;em&gt;"Turn PDF books into usable skills,"&lt;/em&gt; &lt;em&gt;"System requirements: Windows 10 or Windows&lt;br&gt;
11,"&lt;/em&gt; &lt;em&gt;"You must have Claude Code installed"&lt;/em&gt; — and it's served from &lt;code&gt;github.io&lt;/code&gt;, so it&lt;br&gt;
borrows the platform's own credibility. Nobody has to browse a repository or read a diff&lt;br&gt;
to get caught by it. They only have to click Download.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four ways of searching that don't work
&lt;/h2&gt;

&lt;p&gt;Worth recording, so nobody burns an afternoon rediscovering the same dead ends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search by hash.&lt;/strong&gt; GitHub doesn't expose a searchable content hash — no SHA-1 blob
query field, and SHA-256 of file content isn't stored anywhere searchable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search inside the archive.&lt;/strong&gt; Zip contents are never indexed. The launcher string
&lt;code&gt;start utils.exe cert.txt&lt;/code&gt; returns nothing, because it only exists inside a zip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search the repository's own text.&lt;/strong&gt; A control query against the malicious Pages site
returns 0 results, while the same query shape against a large repository returns 32.
The account is too new and too small to be in the code index at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search for the payload's shape.&lt;/strong&gt; The obfuscator randomizes variable names per
sample, and code search tokenizes on words, so &lt;code&gt;local k,Z=i[#i]&lt;/code&gt; matches nothing. The
two &lt;code&gt;Application.cmd&lt;/code&gt;/&lt;code&gt;cert.txt&lt;/code&gt; hits that do surface are a Mac packaging script and
someone's unrelated notes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What actually worked is unglamorous: notice a name-squat, list every repository sharing&lt;br&gt;
the name, diff each against the upstream tree, and open whatever ships that the original&lt;br&gt;
doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not the same operator, as far as the evidence goes
&lt;/h2&gt;

&lt;p&gt;Same impersonation target, same delivery class the first security notice describes — but&lt;br&gt;
this payload is obfuscated and carries no plaintext URLs, so neither Cloudflare Worker&lt;br&gt;
endpoint from the first report appears in it. A link between the two is neither&lt;br&gt;
established nor excluded here, and it shouldn't be implied either way without evidence.&lt;/p&gt;




&lt;p&gt;Why this is on a blog about a self-hosted agent platform rather than a security&lt;br&gt;
newsletter: this is a supply-chain problem aimed directly at people building with AI&lt;br&gt;
coding tools. The impersonation target here converts PDFs into Claude Skills — the exact&lt;br&gt;
kind of small, popular, quickly-forked utility that anyone assembling an agent's toolkit&lt;br&gt;
downloads without a second look. The name is the entire distribution strategy. If you&lt;br&gt;
install skills, MCP servers, or agent tools from GitHub by name rather than by verified&lt;br&gt;
publisher, this is what the failure mode looks like from the inside.&lt;/p&gt;

&lt;p&gt;I write this from building &lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot-AI&lt;/a&gt;, a&lt;br&gt;
self-hosted agent platform — the same category of project where "check what you're&lt;br&gt;
installing before you run it" is the whole point, not an afterthought.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Static analysis only. Nothing was executed and no interpreter was invoked on the&lt;br&gt;
payload; the second archive was extracted to a temporary directory solely to compute the&lt;br&gt;
hashes above, then deleted. Impersonation target:&lt;br&gt;
&lt;a href="https://github.com/virgiliojr94/book-to-skill" rel="noopener noreferrer"&gt;github.com/virgiliojr94/book-to-skill&lt;/a&gt;&lt;br&gt;
(26,868 stars). Prior case: &lt;code&gt;Leutenegger/book-to-skill&lt;/code&gt;, reported 2026-08-17, actioned&lt;br&gt;
2026-08-23.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>github</category>
      <category>malware</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Weekly Update: ✨ docs(process): name the selector — an empty result is not</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:00:06 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-docsprocess-name-the-selector-an-empty-result-is-not-2he0</link>
      <guid>https://dev.to/mrveiss/weekly-update-docsprocess-name-the-selector-an-empty-result-is-not-2he0</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ docs(process): name the selector — an empty result is not a true negative (#15953) (#16102)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 docs(process): name the selector — an empty result is not a true negative (#15953) (#16102)&lt;/li&gt;
&lt;li&gt;🔧 security: allow the two unfixable dev-only npm advisories (#16089) (#16103)&lt;/li&gt;
&lt;li&gt;🔧 ci(duplication-guard): scan the three trees it never opened (#13044) (#16095)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +2&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-02T09:00:03.220327Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-09-02T09:00:03.220327Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>Weekly Update: ✨ fix(automation): count landed files, not just surviving li</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 02 Sep 2026 09:00:08 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-fixautomation-count-landed-files-not-just-surviving-li-3me4</link>
      <guid>https://dev.to/mrveiss/weekly-update-fixautomation-count-landed-files-not-just-surviving-li-3me4</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ fix(automation): count landed files, not just surviving lines, in the branch sweeps (#15036) (#15489)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 fix(automation): count landed files, not just surviving lines, in the branch sweeps (#15036)…&lt;/li&gt;
&lt;li&gt;🔧 test(coverage): give every collection exemption a decision, an issue and a down-only ceiling…&lt;/li&gt;
&lt;li&gt;🔧 feat(health): report the served frontend bundle, not just the process (#15462) (#15465)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +2&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-26T09:00:04.342434Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-26T09:00:04.342434Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>The half of your Claude setup that can't be shared — and why it still needs to be a plugin</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Tue, 01 Sep 2026 13:00:02 +0000</pubDate>
      <link>https://dev.to/mrveiss/the-half-of-your-claude-setup-that-cant-be-shared-and-why-it-still-needs-to-be-a-plugin-20dg</link>
      <guid>https://dev.to/mrveiss/the-half-of-your-claude-setup-that-cant-be-shared-and-why-it-still-needs-to-be-a-plugin-20dg</guid>
      <description>&lt;p&gt;Last time I wrote about the portable half of a Claude Code setup — the process discipline&lt;br&gt;
that transfers to any codebase, packaged as a plugin. Explore before building, prove the&lt;br&gt;
helper doesn't already exist, never claim "done" without pasting the output.&lt;/p&gt;

&lt;p&gt;That half is genuinely reusable. It's also not where most of the damage happens.&lt;/p&gt;

&lt;p&gt;Watch a capable agent work on an unfamiliar project and the failures aren't reasoning&lt;br&gt;
failures. It opens the PR against &lt;code&gt;main&lt;/code&gt; when the project ships from a different branch. It&lt;br&gt;
writes a PR body missing the three headings your CI requires, and the check fails for reasons&lt;br&gt;
the error message doesn't explain. It puts the migration in the plausible-looking directory&lt;br&gt;
rather than the real one. It calls the API endpoint that was deprecated in March, because the&lt;br&gt;
old one is still in the tree.&lt;/p&gt;

&lt;p&gt;None of that is a thinking problem. It's that the information doesn't exist in any form the&lt;br&gt;
agent can find. Your conventions live in your team's heads, in a wiki nobody's opened since&lt;br&gt;
onboarding, and in the reflex of the one person who's been there three years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The information isn't in the codebase
&lt;/h2&gt;

&lt;p&gt;This is the part I got wrong for a while. I assumed that a sufficiently good agent reading a&lt;br&gt;
sufficiently well-organised repo would infer the conventions. Sometimes it does. But&lt;br&gt;
inference from code gives you what the code &lt;em&gt;does&lt;/em&gt;, not what the team has &lt;em&gt;agreed&lt;/em&gt;, and those&lt;br&gt;
differ constantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both &lt;code&gt;main&lt;/code&gt; and a development branch exist and look active. Which one do PRs target? The
code cannot tell you. Both have recent commits.&lt;/li&gt;
&lt;li&gt;Two service-layer patterns exist because one is being migrated to the other. Which is
correct for new work? The tree shows both, in roughly equal numbers.&lt;/li&gt;
&lt;li&gt;A directory holds twelve files, eleven of which are deprecated. Nothing marks them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An agent reading that repo will make a defensible choice and be wrong half the time. So will&lt;br&gt;
a new human contributor — they just ask in Slack instead, which is why the problem stays&lt;br&gt;
invisible until you try to scale it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this doesn't go in CLAUDE.md either
&lt;/h2&gt;

&lt;p&gt;Same argument as last time, sharper. Project instructions are resident in context permanently,&lt;br&gt;
so everything you add competes with the actual task for attention.&lt;/p&gt;

&lt;p&gt;Conventions are unusually bad at justifying that cost, because almost all of them are&lt;br&gt;
&lt;em&gt;situational&lt;/em&gt;. The rules about PR body structure matter during PR creation and nowhere else.&lt;br&gt;
The deploy path matters when deploying. The full-stack debugging map — which layer owns&lt;br&gt;
which symptom — is critical when something breaks and pure noise the rest of the time.&lt;/p&gt;

&lt;p&gt;Push all of it into one always-on file and you get a document nobody can keep current, where&lt;br&gt;
the two rules that would have prevented today's incident are buried among forty that wouldn't.&lt;/p&gt;

&lt;p&gt;Skills load on trigger. That's the whole argument, and it applies harder to project&lt;br&gt;
conventions than to general discipline, because there are far more of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary that turned out to matter
&lt;/h2&gt;

&lt;p&gt;I ended up splitting my skills into two marketplaces, and the dividing line is simpler than I&lt;br&gt;
expected:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a skill names a branch, a path, a service, or a table — it's project-specific.&lt;br&gt;
If it names a discipline — it's portable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;canonical-coding&lt;/code&gt; ("one implementation per concept, prove the thing doesn't exist before you&lt;br&gt;
write it") names a discipline. It's true everywhere. &lt;code&gt;pr&lt;/code&gt; ("target this branch, these headings&lt;br&gt;
are required, run these checks first") names a branch. It's true in exactly one repo and&lt;br&gt;
actively harmful anywhere else.&lt;/p&gt;

&lt;p&gt;The test is useful because it's mechanical. You don't have to reason about whether something&lt;br&gt;
&lt;em&gt;feels&lt;/em&gt; general — you look at whether it can be written without naming a proper noun from your&lt;br&gt;
infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the project-specific half looks like
&lt;/h2&gt;

&lt;p&gt;For &lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot-AI&lt;/a&gt; that came to twelve skills, in&lt;br&gt;
&lt;a href="https://github.com/mrveiss/AutoBot-AI-Claude-dev-skills" rel="noopener noreferrer"&gt;their own marketplace&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue → merge&lt;/strong&gt; — &lt;code&gt;implement&lt;/code&gt; (the full loop: umbrella gate, worktree, design, code, verify,&lt;br&gt;
PR, CI, closure check), &lt;code&gt;batch-implement&lt;/code&gt; (the same across a list of issues, with per-issue&lt;br&gt;
verification), &lt;code&gt;pr&lt;/code&gt; (pre-flight branch checks, correct base branch), &lt;code&gt;pre-merge-validate&lt;/code&gt;&lt;br&gt;
(syntax, imports, call-site impact, tests, types, lint), &lt;code&gt;drain&lt;/code&gt; (pick up the backlog items&lt;br&gt;
that need no human decision).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review&lt;/strong&gt; — &lt;code&gt;review&lt;/code&gt; (CI diagnosis, three-angle finder pass, merge decision) and&lt;br&gt;
&lt;code&gt;review-fleet&lt;/code&gt; (ten parallel review angles with separate verifier agents, posting only&lt;br&gt;
confirmed, deduplicated findings as a single comment).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit&lt;/strong&gt; — &lt;code&gt;api-wiring-audit&lt;/code&gt; (frontend calls an endpoint that exists, backend route is&lt;br&gt;
actually mounted) and &lt;code&gt;dead-code-audit&lt;/code&gt; (unregistered routers, uninvoked hooks, orphaned&lt;br&gt;
components).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debug&lt;/strong&gt; — &lt;code&gt;debug-autobot&lt;/code&gt;, which dispatches an investigator per layer (Vue, FastAPI, Redis,&lt;br&gt;
ChromaDB, NPU, browser, AI stack) and synthesises one root cause. This one is the clearest&lt;br&gt;
example of why the split exists: its entire value is knowing which layers exist and what each&lt;br&gt;
one owns. There is no general version of that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Platform and session&lt;/strong&gt; — &lt;code&gt;github-cli&lt;/code&gt; and &lt;code&gt;session-lifecycle&lt;/code&gt;, the start-of-session and&lt;br&gt;
end-of-session protocol.&lt;/p&gt;

&lt;p&gt;None of that is useful to you. That's the point — it's not meant to be, and trying to make it&lt;br&gt;
general would strip out exactly what makes it work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payoff is onboarding, human and otherwise
&lt;/h2&gt;

&lt;p&gt;One install, and every developer on the project has the same workflow — and so does every&lt;br&gt;
fresh agent session. That second part is easy to undervalue. Agent sessions start from nothing&lt;br&gt;
every time; whatever conventions you established yesterday are gone unless something reloads&lt;br&gt;
them. A plugin is how you make "how we do things here" survive a new context window.&lt;/p&gt;

&lt;p&gt;It also makes conventions reviewable. When the rule lives in a skill file in a repo, changing&lt;br&gt;
it is a pull request someone can argue with — rather than a habit that drifts silently until&lt;br&gt;
two people are doing it differently and neither knows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fails
&lt;/h2&gt;

&lt;p&gt;Skills encoding conventions are only worth it if the conventions are stable. If your branch&lt;br&gt;
strategy is genuinely in flux, a skill that confidently states the wrong base branch is worse&lt;br&gt;
than nothing — a human hesitates and asks, an agent complies immediately and at scale.&lt;/p&gt;

&lt;p&gt;So they need the same maintenance as any other checked-in artefact: when the convention&lt;br&gt;
changes, the skill changes in the same PR. A skill that lies is more expensive than a&lt;br&gt;
convention nobody wrote down.&lt;/p&gt;




&lt;p&gt;The portable half is at&lt;br&gt;
&lt;a href="https://github.com/mrveiss/Claude-Dev-Skills" rel="noopener noreferrer"&gt;Claude-Dev-Skills&lt;/a&gt;, the project-specific half&lt;br&gt;
at &lt;a href="https://github.com/mrveiss/AutoBot-AI-Claude-dev-skills" rel="noopener noreferrer"&gt;AutoBot-AI-Claude-dev-skills&lt;/a&gt;.&lt;br&gt;
Both Apache-2.0.&lt;/p&gt;

&lt;p&gt;I'd like to know whether the boundary rule holds up against your setup — is there a skill in&lt;br&gt;
your workflow that names a proper noun but still feels like it should be portable? That's the&lt;br&gt;
case I haven't figured out yet.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Weekly Update: ✨ fix(setup-wizard): bound the provision-fleet 409 lock by s</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 26 Aug 2026 09:00:09 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-fixsetup-wizard-bound-the-provision-fleet-409-lock-by-s-1341</link>
      <guid>https://dev.to/mrveiss/weekly-update-fixsetup-wizard-bound-the-provision-fleet-409-lock-by-s-1341</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ fix(setup-wizard): bound the provision-fleet 409 lock by staleness, not just status (#14856) (#15090)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 fix(setup-wizard): bound the provision-fleet 409 lock by staleness, not just status (#14856)…&lt;/li&gt;
&lt;li&gt;🔧 fix(access-control): provision the enforcement mode instead of inheriting an unset key (#14866)…&lt;/li&gt;
&lt;li&gt;🔧 docs(bedrock): the module documents a re-export it does not have (#15081) (#15082)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +2&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-19T09:00:03.226436Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-19T09:00:03.226436Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>Agents don't fail at writing code — they fail at everything around it</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Tue, 25 Aug 2026 13:00:02 +0000</pubDate>
      <link>https://dev.to/mrveiss/agents-dont-fail-at-writing-code-they-fail-at-everything-around-it-46ah</link>
      <guid>https://dev.to/mrveiss/agents-dont-fail-at-writing-code-they-fail-at-everything-around-it-46ah</guid>
      <description>&lt;p&gt;I've spent about six months running Claude Code agents against a codebase big enough to&lt;br&gt;
hurt — several hundred open issues, agents committing daily, a CI pipeline that fails loudly&lt;br&gt;
when they get it wrong.&lt;/p&gt;

&lt;p&gt;Here's the thing nobody told me going in: the agents were fine at writing code. Genuinely&lt;br&gt;
fine. Give one a well-scoped function and it comes back with something reasonable.&lt;/p&gt;

&lt;p&gt;What they were bad at was everything &lt;em&gt;around&lt;/em&gt; writing code. Deciding whether the thing&lt;br&gt;
should be built at all. Noticing that the helper they were about to write already existed&lt;br&gt;
sixty lines up. Checking whether the fix worked before announcing that it did. Those aren't&lt;br&gt;
coding failures — they're process failures, and no amount of better prompting fixed them,&lt;br&gt;
because the problem was never the prompt.&lt;/p&gt;

&lt;p&gt;What fixed them was writing the process down.&lt;/p&gt;
&lt;h2&gt;
  
  
  Four failure modes, and what each one taught me
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. The second helper
&lt;/h3&gt;

&lt;p&gt;An agent needs to format a duration. It writes &lt;code&gt;formatDuration()&lt;/code&gt;. Your codebase already has&lt;br&gt;
&lt;code&gt;humanizeElapsed()&lt;/code&gt; in a utils file it never opened.&lt;/p&gt;

&lt;p&gt;This is the most expensive failure mode I hit, because nothing about it looks like a&lt;br&gt;
failure. The code works. Tests pass. Review approves it. You only find out six months later&lt;br&gt;
when you change how durations are displayed and catch three of the four places.&lt;/p&gt;

&lt;p&gt;Agents are strongly biased toward writing new code rather than finding existing code,&lt;br&gt;
because writing is what they're rewarded for and searching is expensive. The counter-pressure&lt;br&gt;
has to be explicit: &lt;strong&gt;before you write a helper, prove the concept doesn't already exist.&lt;/strong&gt;&lt;br&gt;
Not "check quickly" — prove it, with a search you can cite.&lt;/p&gt;

&lt;p&gt;The same discipline kills the "v2" reflex, where an agent that finds a function it doesn't&lt;br&gt;
fully understand writes &lt;code&gt;processDataV2()&lt;/code&gt; next to it and leaves both in the tree forever.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. "Done" that was never checked
&lt;/h3&gt;

&lt;p&gt;Ask an agent whether the fix works and it will tell you the fix works. It is not lying. It&lt;br&gt;
has genuinely reasoned its way to a confident answer, and reasoning feels like verification&lt;br&gt;
from the inside.&lt;/p&gt;

&lt;p&gt;The rule that fixed this is blunt: &lt;strong&gt;you may not say "done", "fixed", or "passing" without&lt;br&gt;
pasting the command output that proves it.&lt;/strong&gt; Not a description of the output. The output.&lt;/p&gt;

&lt;p&gt;The interesting part is how often an agent following that rule catches itself. It goes to&lt;br&gt;
run the test so it can quote the result, the test fails, and the claim never gets made. The&lt;br&gt;
verification step isn't a check on the answer — it's what produces the answer.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Fixing one of twelve
&lt;/h3&gt;

&lt;p&gt;An agent fixes a null-check bug in &lt;code&gt;UserService&lt;/code&gt;. The same bug is in eleven other services,&lt;br&gt;
because they were all written from the same template by the same agent three weeks earlier.&lt;/p&gt;

&lt;p&gt;Agents fix what you point at. They don't generalise from one instance to a class of&lt;br&gt;
instances unless you ask, and the whole reason the bug is interesting is that it's probably&lt;br&gt;
systemic. So after every fix: &lt;strong&gt;sweep the adjacent files for the same defect, and file what&lt;br&gt;
you find.&lt;/strong&gt; File it even if you can't fix it now — an unfixed bug you've recorded is a&lt;br&gt;
backlog item, an unfixed bug nobody noticed is a landmine.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Debugging by guessing
&lt;/h3&gt;

&lt;p&gt;An agent hits a failing test and immediately proposes a fix. Then another. Then another. Each&lt;br&gt;
one is plausible, none of them work, and forty minutes later the file has accumulated three&lt;br&gt;
speculative changes and the original bug is still there — now harder to see.&lt;/p&gt;

&lt;p&gt;What's missing is the step where you find out &lt;em&gt;why&lt;/em&gt; it fails before deciding what to change.&lt;br&gt;
Read the actual error. Reproduce it in isolation. Form one hypothesis, test that hypothesis,&lt;br&gt;
and only then edit. And when three attempts have failed, stop — a fourth attempt is not a&lt;br&gt;
strategy, it's a slot machine. Escalate with what you learned.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I put these in skills rather than CLAUDE.md
&lt;/h2&gt;

&lt;p&gt;The obvious place for rules like these is your project instructions, and I started there. It&lt;br&gt;
doesn't scale.&lt;/p&gt;

&lt;p&gt;Everything in &lt;code&gt;CLAUDE.md&lt;/code&gt; is in context permanently, competing with the actual task for&lt;br&gt;
attention. A twelve-line debugging protocol is exactly right when a test is failing and pure&lt;br&gt;
noise the other 95% of the time. Push enough process in there and the important rules get&lt;br&gt;
diluted by the situational ones.&lt;/p&gt;

&lt;p&gt;Skills load on trigger. The debugging discipline shows up when something breaks and stays out&lt;br&gt;
of the way otherwise. That's the whole difference, and it turns out to matter a lot.&lt;/p&gt;

&lt;p&gt;The second reason is portability. Process discipline isn't project-specific — the "second&lt;br&gt;
helper" problem is the same in every codebase I've worked in. Keeping it in one project's&lt;br&gt;
instructions means re-deriving it in the next project. Packaged as a plugin, it moves.&lt;/p&gt;
&lt;h2&gt;
  
  
  The set
&lt;/h2&gt;

&lt;p&gt;I've extracted the general, project-agnostic half of what accumulated and published it as a&lt;br&gt;
Claude Code plugin marketplace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add mrveiss/Claude-Dev-Skills
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;claude-dev-skills@claude-dev-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eight skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;process&lt;/code&gt;&lt;/strong&gt; — the approach discipline: explore before building, plan a multi-step
change, debug methodically, verify before claiming, dispatch parallel agents, finish a
branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;canonical-coding&lt;/code&gt;&lt;/strong&gt; — one implementation per concept. Failure mode 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;commit&lt;/code&gt;&lt;/strong&gt; — commit workflow with pre-flight checks, auto-format, and retry logic for
when pre-commit hooks rewrite files underneath you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;review-lenses&lt;/code&gt;&lt;/strong&gt; — review by domain lens (architecture, delivery, frontend, docs, UX,
visual craft) instead of one undifferentiated "review this".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;gap-audit&lt;/code&gt;&lt;/strong&gt; — sweep adjacent files after a fix and file the gaps. Failure mode 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;web-audit&lt;/code&gt;&lt;/strong&gt; — security, SEO and AI-friendliness audit of a site: headers, DNS, TLS,
CORS, email spoofing, exposed panels, per-page SEO, compromise indicators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-design&lt;/code&gt;&lt;/strong&gt; — visual direction, typography, colour, layout, spacing, motion,
accessibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;memory-cleanup&lt;/code&gt;&lt;/strong&gt; — end-of-session memory hygiene, so context files stay an index
instead of growing into sludge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apache-2.0, and two of them consolidate ideas from other skill authors — notably Jesse&lt;br&gt;
Vincent's &lt;a href="https://github.com/obra/superpowers" rel="noopener noreferrer"&gt;Superpowers&lt;/a&gt; suite, which is worth reading on&lt;br&gt;
its own.&lt;/p&gt;

&lt;p&gt;They came out of building &lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot-AI&lt;/a&gt;. The&lt;br&gt;
project-specific ones — the issue-to-merge loop, full-stack debugging, the codebase audits —&lt;br&gt;
live in &lt;a href="https://github.com/mrveiss/AutoBot-AI-Claude-dev-skills" rel="noopener noreferrer"&gt;their own marketplace&lt;/a&gt;,&lt;br&gt;
because they hardcode that platform's branch names and paths and are no use anywhere else.&lt;br&gt;
This is the half that travels.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I'd push back on myself
&lt;/h2&gt;

&lt;p&gt;Process discipline has a real cost. Every one of these rules makes the agent slower, and some&lt;br&gt;
of them make it slower in ways that feel pointless in the moment — proving a helper doesn't&lt;br&gt;
exist takes longer than writing the helper, almost every time.&lt;/p&gt;

&lt;p&gt;The trade only pays off over a codebase's lifetime, which means it's genuinely the wrong call&lt;br&gt;
for a prototype you'll throw away in a week. If you're spiking something, skip all of this&lt;br&gt;
and let the agent write.&lt;/p&gt;

&lt;p&gt;Where it pays is the second year, when you're the one maintaining what the agents built.&lt;/p&gt;




&lt;p&gt;If you try the set, I'd like to know where it's wrong: does &lt;code&gt;process&lt;/code&gt; route the way you&lt;br&gt;
actually work, or does it fire when you don't want it? Is &lt;code&gt;canonical-coding&lt;/code&gt; too strict for a&lt;br&gt;
codebase that legitimately carries parallel implementations? And what's missing?&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/mrveiss/Claude-Dev-Skills" rel="noopener noreferrer"&gt;https://github.com/mrveiss/Claude-Dev-Skills&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Weekly Update: ✨ fix(provision): stamp node_roles_declared from the setup w</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 19 Aug 2026 09:00:07 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-fixprovision-stamp-noderolesdeclared-from-the-setup-w-3kn2</link>
      <guid>https://dev.to/mrveiss/weekly-update-fixprovision-stamp-noderolesdeclared-from-the-setup-w-3kn2</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ fix(provision): stamp node_roles_declared from the setup wizard too (#14594) (#14637)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 fix(provision): stamp node_roles_declared from the setup wizard too (#14594) (#14637)&lt;/li&gt;
&lt;li&gt;🔧 fix(infra): read the report file each analyzer writes, not stdout (#14587) (#14636)&lt;/li&gt;
&lt;li&gt;🔧 security(mcp): govern manual_mcp as the twelfth bridge (#14586) (#14627)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +1&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-12T09:00:02.662484Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-12T09:00:02.662484Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>Weekly Update: ✨ refactor(agents): split memory-monitor into capture vs cur</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 12 Aug 2026 09:00:09 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-refactoragents-split-memory-monitor-into-capture-vs-cur-4487</link>
      <guid>https://dev.to/mrveiss/weekly-update-refactoragents-split-memory-monitor-into-capture-vs-cur-4487</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ refactor(agents): split memory-monitor into capture vs curation so capture runs on the cheap tier (#14139)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 refactor(agents): split memory-monitor into capture vs curation so capture runs on the cheap tier…&lt;/li&gt;
&lt;li&gt;🔧 docs(claude): split CLAUDE.md into a trigger-routed index and deconflict the doc set (#14133)&lt;/li&gt;
&lt;li&gt;🔧 perf(agents): pin explicit model tiers on all agent definitions and add a Haiku repo-sweeper…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +2&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-05T09:00:03.299578Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-08-05T09:00:03.299578Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
    <item>
      <title>Weekly Update: ✨ test(kb): make the GPU chunker and KB stats tests able to</title>
      <dc:creator>Mārtiņš Veiss</dc:creator>
      <pubDate>Wed, 05 Aug 2026 09:00:05 +0000</pubDate>
      <link>https://dev.to/mrveiss/weekly-update-testkb-make-the-gpu-chunker-and-kb-stats-tests-able-to-46ii</link>
      <guid>https://dev.to/mrveiss/weekly-update-testkb-make-the-gpu-chunker-and-kb-stats-tests-able-to-46ii</guid>
      <description>&lt;h2&gt;
  
  
  Weekly Update: ✨ test(kb): make the GPU chunker and KB stats tests able to fail (#13563) (#13613)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrveiss/AutoBot-AI" rel="noopener noreferrer"&gt;AutoBot&lt;/a&gt; is an open-source, self-hosted AI agent platform — your data, your AI.&lt;/p&gt;

&lt;p&gt;This week we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 test(kb): make the GPU chunker and KB stats tests able to fail (#13563) (#13613)&lt;/li&gt;
&lt;li&gt;🔧 test(mcp): make the injection tests reach the handler instead of a 404 (#13598) (#13612)&lt;/li&gt;
&lt;li&gt;🔧 fix(api-contract): keep absolute filesystem paths out of OpenAPI schema defaults (#13572) (#13611)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors: +2&lt;/p&gt;

&lt;p&gt;→ Full changelog: &lt;a href="https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-07-29T09:00:02.182745Z" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/commits/Dev_new_gui?since=2026-07-29T09:00:02.182745Z&lt;/a&gt;&lt;br&gt;
→ Discuss on GitHub: &lt;a href="https://github.com/mrveiss/AutoBot-AI/discussions" rel="noopener noreferrer"&gt;https://github.com/mrveiss/AutoBot-AI/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>autobot</category>
      <category>ai</category>
      <category>opensource</category>
      <category>weeklyupdate</category>
    </item>
  </channel>
</rss>
