<?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: Ross Peili</title>
    <description>The latest articles on DEV Community by Ross Peili (@rosspeili).</description>
    <link>https://dev.to/rosspeili</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%2F308648%2Fe3062c7b-4d7d-4ba9-aea5-f0ea4fef4776.jpg</url>
      <title>DEV Community: Ross Peili</title>
      <link>https://dev.to/rosspeili</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rosspeili"/>
    <language>en</language>
    <item>
      <title>I Cancelled Five Project-Management Subs. Here's What Replaced Them.</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:57:29 +0000</pubDate>
      <link>https://dev.to/arpa/i-cancelled-five-project-management-subs-heres-what-replaced-them-285p</link>
      <guid>https://dev.to/arpa/i-cancelled-five-project-management-subs-heres-what-replaced-them-285p</guid>
      <description>&lt;p&gt;Most of us did not set out to collect project-management subscriptions. It happened slowly: Jira for the sprint board, Asana for the client list, Notion for notes that were supposed to stay notes, something else for the timeline, and a spreadsheet because the timeline lied. Every tool wanted an account, a sync server, and a monthly line on the card. Your tasks lived in their cloud. Your focus lived in their notifications.&lt;/p&gt;

&lt;p&gt;That stack is expensive in money and attention. You are always one login screen away from the work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arpacorp.net" rel="noopener noreferrer"&gt;ARPA Hellenic Logical Systems&lt;/a&gt; just shipped &lt;strong&gt;HPPM&lt;/strong&gt; — &lt;strong&gt;High Priority Project Manager&lt;/strong&gt; — a local-first Windows app that treats your disk as the source of truth. No cloud. No account. No rent. Apache 2.0 on &lt;a href="https://github.com/ARPAHLS/hppm" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&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%2F4qqdcpxjaaegkb0a8z7b.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%2F4qqdcpxjaaegkb0a8z7b.png" alt="HPPM" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The pain is familiar
&lt;/h2&gt;

&lt;p&gt;Modern PM tools optimize for retention, not clarity. You upload your life, pay to access your own notes, and sit through upsells while trying to finish one task. Tabs multiply. Context scatters. If the vendor changes pricing or policy, your history is hostage.&lt;/p&gt;

&lt;p&gt;HPPM starts from a different assumption: &lt;strong&gt;your work should stay in plain files you can read without anyone's permission.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What HPPM actually is
&lt;/h2&gt;

&lt;p&gt;HPPM is not a social network, a sync service, or an ad surface. It is a &lt;strong&gt;desk you spread your work on&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your tasks live in numbered markdown trackers — &lt;code&gt;01-work.md&lt;/code&gt;, &lt;code&gt;02-personal.md&lt;/code&gt;, and so on — with priority sections, checkboxes, and titles you can edit in any editor. Metadata (tags, dates, links, notes, audit history) sits in a &lt;code&gt;.hppm/&lt;/code&gt; folder beside those files. Nothing phones home.&lt;/p&gt;

&lt;p&gt;The app adds what markdown alone cannot: &lt;strong&gt;six views&lt;/strong&gt;, filters, drag-and-drop, analytics, and an audit trail — all offline.&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%2Flqw690zgpetfc8siqsai.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%2Flqw690zgpetfc8siqsai.png" alt="Overview dashboard" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt; for open/done/overdue at a glance. &lt;strong&gt;Table&lt;/strong&gt; (sheet or list) for spreadsheet scans. &lt;strong&gt;Kanban&lt;/strong&gt; by priority or tracker. &lt;strong&gt;Timeline&lt;/strong&gt; as Gantt lanes or calendar. &lt;strong&gt;Neural&lt;/strong&gt; as a force-directed graph of links and clusters. &lt;strong&gt;Fruits&lt;/strong&gt; as a "what should I tackle next?" ranker when the list is too long to parse.&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%2Fhza9b6hsey0za6wm86nl.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%2Fhza9b6hsey0za6wm86nl.png" alt="Kanban board" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keyboard shortcuts (&lt;code&gt;?&lt;/code&gt; for the full cheat sheet), fourteen themes, seven UI languages, and 36 persona templates if you want a seeded project on day one — resort ops, software sprint, clinic, indie founder, and others.&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%2Fqzzpgvxai2v4dvsr2uer.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%2Fqzzpgvxai2v4dvsr2uer.png" alt="Fruits — priority picker" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works (without the magic)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install the Windows app — &lt;strong&gt;&lt;a href="https://github.com/ARPAHLS/hppm/releases/download/v0.26/HPPM_v026.exe" rel="noopener noreferrer"&gt;HPPM_v026.exe&lt;/a&gt;&lt;/strong&gt; from the &lt;a href="https://github.com/ARPAHLS/hppm/releases/tag/v0.26" rel="noopener noreferrer"&gt;v0.26 release&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pick a workspace folder or create a project from a template.&lt;/li&gt;
&lt;li&gt;Work. Drag cards, stretch timeline bars, filter by tag, complete tasks. HPPM writes back to markdown.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the internet vanishes tomorrow, your trackers are still on your drive. Back them up like any folder. Diff them in git. Open them in Obsidian or VS Code. The app is the lens — not the landlord.&lt;/p&gt;

&lt;p&gt;Developers can also run from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ARPAHLS/hppm.git
&lt;span class="nb"&gt;cd &lt;/span&gt;hppm
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opens &lt;code&gt;http://localhost:5173&lt;/code&gt; — same UI, same API, no installer required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who it is for
&lt;/h2&gt;

&lt;p&gt;Builders, operators, privacy-minded professionals, and anyone tired of SaaS sprawl — people who want &lt;strong&gt;one calm desk&lt;/strong&gt; for priorities: offline, auditable, and free of recurring fees.&lt;/p&gt;

&lt;p&gt;It is not for teams that need real-time multi-user sync out of the box. It &lt;em&gt;is&lt;/em&gt; for individuals and small groups who value &lt;strong&gt;ownership&lt;/strong&gt; over features that require a server bill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/hppm/releases/download/v0.26/HPPM_v026.exe" rel="noopener noreferrer"&gt;HPPM_v026.exe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source &amp;amp; docs:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/hppm" rel="noopener noreferrer"&gt;github.com/ARPAHLS/hppm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publisher:&lt;/strong&gt; &lt;a href="https://arpacorp.net" rel="noopener noreferrer"&gt;arpacorp.net&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built HPPM because project management should feel like a workspace, not a subscription. If that resonates, take it for a spin — and tell us what breaks. Contributions and suggestions more than welcome.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>projectmanagement</category>
      <category>tracker</category>
    </item>
    <item>
      <title>Agents Can Remove Image Backgrounds Locally — No Cloud API Required</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Thu, 16 Jul 2026 18:57:48 +0000</pubDate>
      <link>https://dev.to/arpa/agents-can-remove-image-backgrounds-locally-no-cloud-api-required-1m3e</link>
      <guid>https://dev.to/arpa/agents-can-remove-image-backgrounds-locally-no-cloud-api-required-1m3e</guid>
      <description>&lt;p&gt;Are you building an agent, or are you the agent that should &lt;strong&gt;remove image backgrounds&lt;/strong&gt; — product shots, portraits, uploads from chat — without wiring a separate cloud API or hoping the model “edits” pixels in prose?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skillware&lt;/strong&gt; has a registry skill for that: &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/creative/bg_remover" rel="noopener noreferrer"&gt;&lt;code&gt;creative/bg_remover&lt;/code&gt;&lt;/a&gt;. Load it once, call &lt;code&gt;execute()&lt;/code&gt; from any agent loop. Same skill, zero adapter rewrites across Gemini, Claude, OpenAI, DeepSeek, or Ollama.&lt;/p&gt;

&lt;p&gt;Shipped in &lt;a href="https://github.com/ARPAHLS/skillware/releases" rel="noopener noreferrer"&gt;Skillware v0.4.5&lt;/a&gt;. Authored by &lt;a href="https://github.com/AyushSrivastava1818" rel="noopener noreferrer"&gt;@AyushSrivastava1818&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skillware in a nutshell
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; is an open registry of &lt;strong&gt;installable agent capabilities&lt;/strong&gt; — deterministic Python skills any compatible runtime can load.&lt;/p&gt;

&lt;p&gt;Each skill is a bundle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;skill.py&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;execute()&lt;/code&gt; returns JSON; no LLM inside the handler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;instructions.md&lt;/code&gt;&lt;/strong&gt; — when the model should call the tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;manifest.yaml&lt;/code&gt;&lt;/strong&gt; — schema, constitution, issuer, requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests and catalog docs&lt;/strong&gt; — shipped in the wheel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You &lt;code&gt;SkillLoader.load_skill("category/skill_name")&lt;/code&gt;, adapt for your provider, pass instructions as system context, wire tool calls to &lt;code&gt;execute()&lt;/code&gt;. The &lt;strong&gt;model decides when&lt;/strong&gt;; the &lt;strong&gt;skill decides how&lt;/strong&gt;, predictably, every time.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://skillware.site/documentation" rel="noopener noreferrer"&gt;skillware.site/documentation&lt;/a&gt; · &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/usage/agent_loops.md" rel="noopener noreferrer"&gt;agent loops&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;creative/bg_remover&lt;/code&gt;: what it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Registry ID:&lt;/strong&gt; &lt;code&gt;creative/bg_remover&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Catalog:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/bg_remover.md" rel="noopener noreferrer"&gt;bg_remover.md&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://skillware.site/skills/bg-remover" rel="noopener noreferrer"&gt;skillware.site/skills/bg-remover&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Local background removal via &lt;a href="https://github.com/danielgatis/rembg" rel="noopener noreferrer"&gt;rembg&lt;/a&gt;. Pass Base64 image data or a local file path; get a &lt;strong&gt;transparent PNG&lt;/strong&gt; back with width, height, and &lt;code&gt;model_used&lt;/code&gt; metadata.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base64 still image (chat / upload handoff)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;input_path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path to a local file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;output_path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional — write PNG to disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;isnet-general-use&lt;/code&gt; (default), &lt;code&gt;u2net_human_seg&lt;/code&gt; for people, others&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alpha_matting&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Finer edges (hair, fur) — slower when enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;No cloud credentials&lt;/strong&gt; for the skill itself. Processing stays on your machine. Constitution is explicit: still images only, local-first, no storing image bytes, structured errors on bad input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First run:&lt;/strong&gt; rembg downloads an ONNX model (~176 MB for &lt;code&gt;isnet-general-use&lt;/code&gt;) to the local cache. Later runs reuse it and are much faster. Provider API keys are only for the LLM loop around the skill — not for removal.&lt;/p&gt;


&lt;h2&gt;
  
  
  Agent vs skill
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent (LLM + your loop)&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parses “remove the background from this product photo”&lt;/td&gt;
&lt;td&gt;Runs rembg on bytes or a file path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chooses Base64 vs path, model, output location&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;image_base64&lt;/code&gt; or writes &lt;code&gt;output_path&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shows the result to the user&lt;/td&gt;
&lt;td&gt;Same input → same deterministic output&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model does not paint transparency. The skill does.&lt;/p&gt;


&lt;h2&gt;
  
  
  Try it: install and direct execute
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"skillware[creative_bg_remover]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.loader&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;

&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;creative/bg_remover&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_no_bg.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For chat handoff, omit &lt;code&gt;output_path&lt;/code&gt; and use &lt;code&gt;result["image_base64"]&lt;/code&gt; from the JSON.&lt;/p&gt;


&lt;h2&gt;
  
  
  Try it: any agent loop
&lt;/h2&gt;

&lt;p&gt;Same pattern as wallet screening, token limiting, or UK Companies House — load the bundle, expose the tool schema to your provider, call &lt;code&gt;skill.execute(tool_input)&lt;/code&gt; on tool use:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.loader&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;

&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;creative/bg_remover&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;
&lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_gemini_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# or to_claude_tool, to_openai_tool, ...
&lt;/span&gt;
&lt;span class="c1"&gt;# User: "Remove the background from product.png and save product_no_bg.png"
# On tool_call: skill.execute(tool_input)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per-provider snippets live on the &lt;a href="https://skillware.site/skills/bg-remover" rel="noopener noreferrer"&gt;skill page&lt;/a&gt; and in &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/bg_remover.md" rel="noopener noreferrer"&gt;docs/skills/bg_remover.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;CLI smoke test after install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skillware &lt;span class="nb"&gt;test &lt;/span&gt;creative/bg_remover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why local matters for agents
&lt;/h2&gt;

&lt;p&gt;Cloud cutout APIs add keys, latency, and data leaving your process. For ecommerce pipelines, internal tools, or agents that already handle files and Base64, &lt;strong&gt;offline rembg behind a fixed schema&lt;/strong&gt; is easier to audit: one &lt;code&gt;execute()&lt;/code&gt; contract, testable in CI, chainable with other skills in the same loop.&lt;/p&gt;

&lt;p&gt;Pair it with &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/monitoring/token_limiter" rel="noopener noreferrer"&gt;&lt;code&gt;monitoring/token_limiter&lt;/code&gt;&lt;/a&gt; if the agent is doing multi-step image batches — cap spend in the outer loop while the remover stays deterministic inside.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;GitHub — ARPAHLS/skillware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/creative/bg_remover" rel="noopener noreferrer"&gt;Skill source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/bg_remover.md" rel="noopener noreferrer"&gt;Catalog page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/releases" rel="noopener noreferrer"&gt;v0.4.5 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/README.md" rel="noopener noreferrer"&gt;Skill library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contributor: &lt;a href="https://github.com/AyushSrivastava1818" rel="noopener noreferrer"&gt;@AyushSrivastava1818&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agent touches images, load the skill before the model improvises a workflow. One line to install, one registry ID, any host.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>skillware</category>
      <category>agentskills</category>
      <category>python</category>
    </item>
    <item>
      <title>Skillware 0.4.3 — Gemini Tool Calling, CLI, Refined</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Fri, 10 Jul 2026 07:37:08 +0000</pubDate>
      <link>https://dev.to/arpa/skillware-043-gemini-tool-calling-cli-refined-591d</link>
      <guid>https://dev.to/arpa/skillware-043-gemini-tool-calling-cli-refined-591d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Skillware 0.4.3&lt;/strong&gt; tightens how skills plug into Google Gemini: clearer tool objects, automatic name sanitization, and docs/examples that all tell the same story. If you are building agent loops on top of the registry, this release is mostly about making the happy path shorter and more predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini adapter: from dict to &lt;code&gt;types.Tool&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Earlier releases exposed Gemini tools as a plain Python dict — name, description, parameters. That worked for some quick experiments, or if you wrote your own sanitization scripts, but the &lt;code&gt;google-genai&lt;/code&gt; SDK expects a &lt;strong&gt;&lt;code&gt;types.Tool&lt;/code&gt;&lt;/strong&gt; when you pass &lt;code&gt;tools=[...]&lt;/code&gt; into &lt;code&gt;GenerateContentConfig&lt;/code&gt;. In practice, copy-paste from the README or examples could fail depending on SDK version and how you wired the call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0.4.3 changes the contract:&lt;/strong&gt; &lt;code&gt;SkillLoader.to_gemini_tool()&lt;/code&gt; now returns a ready-to-use &lt;code&gt;google.genai.types.Tool&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before — manual assembly in some setups
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;decl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_gemini_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;decl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_sanitize_function_tool_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_declarations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decl&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Screen wallet 0xd8dA...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine when you knew the SDK shape. Extra steps when you did not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Now — one call, pass straight through
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_gemini_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Screen wallet 0xd8dA...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same mental model as the docs always showed — load skill, adapt, call Gemini — with the adapter doing the wrapping for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic name sanitization
&lt;/h2&gt;

&lt;p&gt;Registry skills use human-readable IDs with slashes: &lt;code&gt;finance/wallet_screening&lt;/code&gt;, &lt;code&gt;office/pdf_form_filler&lt;/code&gt;. OpenAI and DeepSeek adapters already mapped those to underscore names. Gemini now follows the same rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0.4.3 sanitizes inside the loader:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;finance/wallet_screening&lt;/code&gt; → &lt;code&gt;finance_wallet_screening&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;office/pdf_form_filler&lt;/code&gt; → &lt;code&gt;office_pdf_form_filler&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude still uses slash IDs — that is by design. Gemini, OpenAI, and DeepSeek share sanitized dispatch.&lt;/p&gt;

&lt;p&gt;When you match tool calls in a loop:&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;TOOL_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_sanitize_gemini_tool_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;manifest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TOOL_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Single-tool examples that execute on any &lt;code&gt;function_call&lt;/code&gt; keep working unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples, tests, and docs — aligned
&lt;/h2&gt;

&lt;p&gt;Nothing under &lt;code&gt;skills/&lt;/code&gt; changed. The integration layer did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Examples&lt;/strong&gt; — All &lt;code&gt;examples/gemini_*.py&lt;/code&gt; scripts use &lt;code&gt;to_gemini_tool()&lt;/code&gt; directly; manual &lt;code&gt;types.Tool(...)&lt;/code&gt; wrapping removed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests&lt;/strong&gt; — Coverage for return type, sanitization, and a catalog doc lint so Gemini snippets do not drift back to old patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt; — &lt;code&gt;gemini.md&lt;/code&gt;, skill catalog pages, &lt;code&gt;agent_loops.md&lt;/code&gt;, &lt;code&gt;cli.md&lt;/code&gt;, and &lt;code&gt;introduction.md&lt;/code&gt; describe sanitized Gemini names consistently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Root &lt;strong&gt;README&lt;/strong&gt; quick start matches runtime behavior — load, adapt, loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also in 0.4.3
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Contributor docs&lt;/strong&gt; — Category selection guidance in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; (#204).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub project&lt;/strong&gt; — Refreshed issue templates, PR template, label taxonomy, and CI sync from &lt;code&gt;.github/labels.json&lt;/code&gt; (#227).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI&lt;/strong&gt; — Same interactive experience as 0.4.2 (splash, menu, list, examples, test). Handy for browsing what ships with the package:&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%2Ft77sj670aqemj9pzvwcy.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%2Ft77sj670aqemj9pzvwcy.png" alt="Skillware CLI — interactive menu and skill list" width="800" height="509"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; skillware
skillware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upgrade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; skillware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; &lt;span class="s2"&gt;"skillware[gemini]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note for advanced callers:&lt;/strong&gt; if you indexed the old dict return (&lt;code&gt;tool["name"]&lt;/code&gt;), use the SDK object instead (&lt;code&gt;tool.function_declarations[0].name&lt;/code&gt;). Standard pass-through usage is simpler after upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;https://github.com/ARPAHLS/skillware&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;https://skillware.site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changelog: &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/CHANGELOG.md#043---2026-07-10" rel="noopener noreferrer"&gt;https://github.com/ARPAHLS/skillware/blob/main/CHANGELOG.md#043---2026-07-10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gemini guide: &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/usage/gemini.md" rel="noopener noreferrer"&gt;https://github.com/ARPAHLS/skillware/blob/main/docs/usage/gemini.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to @Areen-09 (#223, #229), @syed7-crypto (#205), and the maintainers who landed doc follow-ups (#245). Feedback and skill proposals welcome on GitHub.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>gemini</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Any Agent Can Now Query Government Registry Data via NLP</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Wed, 08 Jul 2026 09:45:36 +0000</pubDate>
      <link>https://dev.to/arpa/any-agent-can-now-query-government-registry-data-via-nlp-em6</link>
      <guid>https://dev.to/arpa/any-agent-can-now-query-government-registry-data-via-nlp-em6</guid>
      <description>&lt;p&gt;If you are building agents for financial compliance, corporate due diligence, or KYC workflows, you have probably hit the same wall: the model can &lt;em&gt;talk&lt;/em&gt; about companies, but getting &lt;strong&gt;official registry data&lt;/strong&gt; — directors, beneficial owners, filings, etc. means custom API glue, brittle prompts, and hope that the LLM picked the right legal entity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARPA’s latest addition to the &lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; registry — &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/finance/uk_companies_house_handler" rel="noopener noreferrer"&gt;&lt;code&gt;finance/uk_companies_house_handler&lt;/code&gt;&lt;/a&gt; — lets any supported model or agent query the &lt;a href="https://developer.company-information.service.gov.uk/" rel="noopener noreferrer"&gt;UK Companies House Public Data API&lt;/a&gt; through structured tool calls.&lt;/strong&gt; Natural language stays with the agent, HTTP, parsing, disambiguation, and UK corporate terminology stay in deterministic Python. Shipped in &lt;a href="https://github.com/ARPAHLS/skillware/releases/tag/v0.4.1" rel="noopener noreferrer"&gt;Skillware v0.4.1&lt;/a&gt;, authored by &lt;a href="https://github.com/Areen-09" rel="noopener noreferrer"&gt;@Areen-09&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ask &lt;em&gt;“Who is the CEO of BP?”&lt;/em&gt; and the agent maps intent, resolves the company, fetches officers, without inventing a company number or confusing US job titles with UK registry roles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skillware in a nutshell
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; is an open-source framework for &lt;strong&gt;installable agent capabilities&lt;/strong&gt;. Each skill is a bundle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;skill.py&lt;/code&gt;&lt;/strong&gt; — deterministic &lt;code&gt;execute()&lt;/code&gt; returning JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;instructions.md&lt;/code&gt;&lt;/strong&gt; — when and how the model should call the tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;manifest.yaml&lt;/code&gt;&lt;/strong&gt; — schema, constitution, issuer, env vars&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests and catalog docs&lt;/strong&gt; — shipped in the wheel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You &lt;code&gt;load_skill("category/skill_name")&lt;/code&gt;, adapt for Gemini, Claude, OpenAI, or others, pass instructions as system context, and wire tool calls to &lt;code&gt;execute()&lt;/code&gt;. Same loop everywhere — see the &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/introduction.md" rel="noopener noreferrer"&gt;introduction&lt;/a&gt; and &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/usage/agent_loops.md" rel="noopener noreferrer"&gt;agent loops guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That split is why agents prefer it over ad-hoc tool JSON or opaque skills blobs: the &lt;strong&gt;model decides when&lt;/strong&gt;; the &lt;strong&gt;skill decides how&lt;/strong&gt;, predictably, every time. No LLM inside the handler. No mystery middleware. One registry ID, any runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;uk_companies_house_handler&lt;/code&gt;: what it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Registry ID:&lt;/strong&gt; &lt;code&gt;finance/uk_companies_house_handler&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Catalog:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/uk_companies_house_handler.md" rel="noopener noreferrer"&gt;uk_companies_house_handler.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Six actions, one entry point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;map_intent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turn keywords like “CEO”, “owner”, “shareholder” into the right UK operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resolve_company&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search by name; return ranked candidates or a single match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_company_profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Status, type, SIC codes, address, charges, insolvency flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_officers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Directors and secretaries (current or historical)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_pscs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persons with significant control — UK beneficial ownership&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_filing_history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Accounts, confirmation statements, incorporations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every response carries a &lt;strong&gt;status envelope&lt;/strong&gt;: &lt;code&gt;ready&lt;/code&gt;, &lt;code&gt;needs_input&lt;/code&gt;, or &lt;code&gt;error&lt;/code&gt;, plus &lt;code&gt;fetched_at&lt;/code&gt; and &lt;code&gt;source&lt;/code&gt;. Ambiguous names like “BP” return &lt;strong&gt;candidates&lt;/strong&gt;, not guesses — the agent asks the user, then continues with a verified &lt;code&gt;company_number&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Bundled &lt;code&gt;terminology_map.yaml&lt;/code&gt; translates US business language into UK registry concepts (CEO → director, owner → PSC). The constitution is explicit: public data only, no filing submissions, no caching officer PII beyond the request, always cite company number and timestamp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt; a free &lt;a href="https://developer.company-information.service.gov.uk/" rel="noopener noreferrer"&gt;Companies House API key&lt;/a&gt; in &lt;code&gt;.env&lt;/code&gt; as &lt;code&gt;COMPANIES_HOUSE_API_KEY&lt;/code&gt;. Provider keys (e.g. &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;) only if you run an LLM loop.&lt;/p&gt;


&lt;h2&gt;
  
  
  Agent vs skill
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent (LLM + your loop)&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parses natural language&lt;/td&gt;
&lt;td&gt;Executes HTTP against Companies House&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handles disambiguation dialogue&lt;/td&gt;
&lt;td&gt;Returns structured candidates and next actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synthesizes the final answer&lt;/td&gt;
&lt;td&gt;Maps intent keywords to operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The skill does not replace your compliance analyst — it &lt;strong&gt;equips&lt;/strong&gt; the agent with the same structured lookups an analyst would run, at machine speed, auditable step by step.&lt;/p&gt;


&lt;h2&gt;
  
  
  Try it: direct execute
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.loader&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.env&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_env_file&lt;/span&gt;

&lt;span class="nf"&gt;load_env_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;finance/uk_companies_house_handler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolve_company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;candidates&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it: intent → officers pipeline
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;map_intent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intent_keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CEO, director&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entities&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company_query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;officers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_officers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00102498&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active_only&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it: full Gemini loop
&lt;/h2&gt;

&lt;p&gt;Runnable scripts ship in the repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; skillware
python examples/uk_companies_house_handler_demo.py
python examples/gemini_uk_companies_house_handler.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The demo script is mocked (no API key). The Gemini example needs &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; and &lt;code&gt;COMPANIES_HOUSE_API_KEY&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Outro
&lt;/h2&gt;

&lt;p&gt;Government registries are not chat-native. They are API-native, jurisdiction-specific, and unforgiving about entity resolution. &lt;strong&gt;&lt;code&gt;finance/uk_companies_house_handler&lt;/code&gt;&lt;/strong&gt; turns that into a plug-and-play Skillware bundle: load once, chain with screening or token-budget skills, run on any model you already use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/finance/uk_companies_house_handler" rel="noopener noreferrer"&gt;Skill source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/uk_companies_house_handler.md" rel="noopener noreferrer"&gt;Catalog page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/releases/tag/v0.4.1" rel="noopener noreferrer"&gt;v0.4.1 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillware.site/skills" rel="noopener noreferrer"&gt;Skill library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contributor: &lt;a href="https://github.com/Areen-09" rel="noopener noreferrer"&gt;@Areen-09&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions and skill ideas welcome in the repo. If your agents touch UK corporates, start here — before the model freelances a company number.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>agentskills</category>
      <category>skillware</category>
    </item>
    <item>
      <title>Quantum Is Less About Physics &amp; Math, And More About You</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Sat, 04 Jul 2026 16:52:02 +0000</pubDate>
      <link>https://dev.to/rosspeili/quantum-is-less-about-physics-math-and-more-about-you-2ijl</link>
      <guid>https://dev.to/rosspeili/quantum-is-less-about-physics-math-and-more-about-you-2ijl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The uncertainty that comes with Quantum Mechanics is the gift, not the problem that many career scientists are desperately trying to solve for a resume update.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was sitting in a coffee shop in Moscow last week, eavesdropping on a conversation between two founders. One was pitching something like “quantum breeding of DNA strands for faster desirable results in synthetic plants and foods,” while the other nodded along, sipping his oat milk latte, as if it were the most natural thing in the world, nobody blinked, nobody said, “wait, you’re telling me your software relies on particles being in two places at once?” or whatever, they just… accepted it, as if it was natural.&lt;/p&gt;

&lt;p&gt;Now, I might not be considered a Quantum expert if you'd ask self-proclaimed LinkedIn experts in the domain, but I didn't have to be one in order to realize the obvious fact that the quantum revolution already happened. Not in a lab, or a press release from IBM or Google or whatever. It happened quietly, in the collective psyche of people who have never solved Schrödinger’s equation, never touched a dilution refrigerator, and probably couldn’t tell a qubit from a cucumber. The true, practical, real-time effect of quantum on society isn’t a faster computer, but that we’ve all been gently forced to believe that the impossible is not only possible, but probably the default state of what we refer to as "reality" atm. And that changes everything, for everyone.&lt;/p&gt;

&lt;p&gt;Hear me out, or better, think about what quantum mechanics actually asks of you. It asks you to accept that a particle doesn’t have a definite position until you look at it. That two particles separated by a galaxy can somehow “know” about each other’s state instantly. That a cat can be dead and alive at the same time, and no, it’s not a metaphor, it’s a serious thought experiment that scientists use to illustrate how the universe might actually work. For a species that spent centuries copy-pasting writings about evolution and pretending we came from monkeys, this isn’t just a scientific update, but more like psychological shock therapy.&lt;/p&gt;

&lt;p&gt;When Newton published the Principia in 1687, he gave us a cosmos that was orderly, predictable, and sane. Cause led to effect. If you knew the position and velocity of every atom, you could predict the entire future. Pierre-Simon Laplace later made it a philosophical doctrine: a demon with enough information could know all that was, is, and ever will be. That view shaped the Enlightenment, the Industrial Revolution, and the very architecture of our minds. We came to believe in a reality that, even if complicated, was fundamentally knowable. That’s the crib we grew up in by default.&lt;/p&gt;

&lt;p&gt;Then quantum mechanics pulled the rug out from under the crib, the floor, and the very concept of “under.”&lt;/p&gt;

&lt;p&gt;The pioneers of quantum theory were the first to be psychologically pummeled by it, eg. take Werner Heisenberg, who formulated the uncertainty principle, and said “I repeated to myself again and again the question: Can nature possibly be as absurd as it seemed to us in these atomic experiments?” or Niels Bohr, who famously remarked, “Anyone who is not shocked by quantum theory has not understood it.” Einstein, even tho I have little respect for his narrators, until his death, called it “spooky action at a distance” and insisted, “God does not play dice.” Thinking they were the smartest people in the room, it would feel weird for a common NPC to analogize that they were grappling with a reality that felt like a betrayal of reason itself as we know it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Only Quantum Supremacy That Matters Is Inside Your Head
&lt;/h2&gt;

&lt;p&gt;Now, fast forward a century, and that very absurdity has seeped out of the textbooks and into the water supply of our very culture. You don’t need a physics or math PhD, or whatever, to talk about the multiverse. The phrase “quantum leap” is used to sell fkn self-help courses. People casually describe relationships as “entangled” or talk about “manifesting” reality by observing it, a rough, pop-spirituality echo of the observer effect. So, it has nothing to do with accurate science, yet it’s a profound symptom of it. Maybe the wildest, most counterintuitive ideas ever validated by experiment have become part of the mental furniture of ordinary life, and we’ve not only stopped resisting the bonkers, but we’ve started building our entire identities around it.&lt;/p&gt;

&lt;p&gt;This is the real quantum supremacy, if you ask me: not a machine that beats a classical computer at a rigged benchmark, or on the paid PR headline, but a quiet, sweeping shift in what the human mind is willing to consider as real. &lt;/p&gt;

&lt;p&gt;The hard science is important, of course, for those who actually understand it, meaning those who understand they will never understand it, those who start bringing God into the equation more often as they dive deeper into the path of understanding, even if they rejected such blatant descriptions of reality in the past. &lt;/p&gt;

&lt;p&gt;The mathematics is so abstract that, as Richard Feynman said, “I think I can safely say that nobody understands quantum mechanics.” He didn’t mean nobody can use the equations, but that the picture of reality behind them defies our evolved intuitions. We are a species, especially the current spectrum of everyone alive, that learned to survive by waiting for the bus, paying taxes, and watching TV, not by computing probability amplitudes in an infinite-dimensional Hilbert space. Yet here we are, collectively internalizing that the substrate of everything, the reason your body holds together, the reason the sun shines, the reason you can read these words on a computer screen, operates on principles that would make a medieval theologian blush like a tsundere fan of a typical harem anime protagonist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quantum Mechanics As A PsyOp
&lt;/h2&gt;

&lt;p&gt;And this is where the philosophical pivot lands, right now, today. People who were once stubborn materialists, who prided themselves on “seeing is believing,” are finding it increasingly difficult to hold that line. Quantum mechanics, without their permission, has dismantled the notion that reality is just tiny billiard balls bouncing around. It has smuggled in mystery at the ground floor. The most rigorous, empirically tested theory in history tells us that at a fundamental level, things don’t exist in a definite state, but more like a cloud of possibilities until an interaction occurs. “We are not passive observers of an objective reality,” wrote physicist John Archibald Wheeler. “We are participants in the construction of the world.” That is not a slogan from some feminist rights poster, but literally a pillar of modern physics.&lt;/p&gt;

&lt;p&gt;The effect on our psychology is immense, and it’s happening whether we acknowledge it or not, like a low-frequency hum that’s slowly retuning our expectations. If the universe is deeply, irrevocably weird, say if it allows for non-locality, superposition, and genuine indeterminism, then the rigid boundaries we drew around what is “impossible” in our personal lives, in society, in our conception of the future, start to soften. If particles can tunnel through barriers that classical physics says are insurmountable, might there be a way through our own? If observation brings potential into actuality, what role does attention play in shaping our days? This isn’t magical thinking, but a natural, almost inevitable, extension of accepting the implications of our best science.&lt;/p&gt;

&lt;p&gt;And again, there are those who would sooner accept that we emerged from monkeys or whatever, over millions of years of random, unexplained occurrences, than entertain even the faintest possibility of anything beyond what the TV, Insta, or a NASA press release has handed them as ready-to-swallow intel. It doesn't just scare them or repel them, the notion that we might inhabit something like a server, that we are organic information processors, let alone the extension of that thought into realms where words like "God" become unavoidable.&lt;/p&gt;

&lt;p&gt;Even when voices as scattered across history as Feynman, Tesla, and Socrates all point in the same direction, that humane units are information processors, that reality is a predefined construct, that thought can alter the physical and not just if you "know how frequencies work", etc. people still wave it away. What's ironic is they dismiss it by saying, "that's not scientific", or whatever, as if science would exist without these very minds, that by the way, all pointed toward God, all recognized that intelligence is artificial by nature, including ours, and all suspected the environment we inhabit is pre-designed. The even deeper irony? Ask these same defender NPCs of scientific purity to name any scientific theory, and they scratch their head. They don't understand science. They just use it like a get-out-of-jail-free card whenever they're confronted with a reality they cannot accept, or, more accurately, a reality they cannot even comprehend as a concept.&lt;/p&gt;

&lt;p&gt;History shows that shifts in cosmology reshape the human self-portrait, eg. Copernicus moved us from the center of the universe, Darwin connected us to all life, Freud revealed an unconscious we didn’t control, etc. and each time, the initial response was denial, then a slow, deep reweaving of the cultural fabric. Quantum is the latest and most disorienting chapter. But unlike the previous ones, its strangeness isn’t a far-off fact about stars or fossils or dreams. It’s woven into the chips in our phones, the lasers in our hospital scanners, and the cryptographic keys that secure our emails. We can’t dismiss it as abstraction. We use it every second, and so we are, in a very real sense, brushing up against the impossible with every tap of a screen. We literally live in a world where "scrolling", "taxes", "cars", are considered normal, human, natural even.&lt;/p&gt;

&lt;p&gt;What I see around me, or what prompted that coffee-shop epiphany, is a generation that despite all the talk of political polarization and post-truth, is incubating a radical new tolerance for the preposterous. Not in a cynical, “facts don’t matter” way, but in a genuinely open, epistemically humble way. If a particle can be a wave and a particle, if an effect can precede its cause at the quantum level, if the act of looking determines what is seen, then maybe the world is far more plastic, more relational, and more mysterious than the old Newtonian model allowed. This doesn’t make people abandon reason, but forces them to expand the definition of what reason can accommodate.&lt;/p&gt;

&lt;p&gt;The commercial quantum narratives, the hype cycles, the geopolitical scrambles for “supremacy”, they are surface ripples, while underneath them is a deeper, human story, our story. &lt;/p&gt;

&lt;p&gt;We are learning, collectively, to live with uncertainty not as a temporary nuisance but as the permanent ground of being. The philosopher Kierkegaard wrote of a “leap of faith” required to live meaningfully in a world without objective certainty. A century of quantum physics has made that leap not just a religious or existential choice, but a scientifically literate one. We are tuning into a state of mind where the unexplored, the unacceptable, the “that can’t be right” become not only real but an acceptable part of who we are.&lt;/p&gt;

&lt;p&gt;That is the gift of quantum right now, and it's not a timeline to a mythical quantum computer that will crack all encryption or hack your bloody bitcoin wallet or whatever, but a daily invitation to hold our certainties more lightly. To listen to an outlandish startup pitch, or a friend’s improbable dream, or even an opposing political view, and think: well, if the electron can do it, maybe there’s a possibility here I can’t yet see. The most stubborn non-believer, the one who never opened a science book, is already being shaped by this. They just don’t call it quantum. They call it a hunch, a change of heart, or a moment of unexpected grace. I mean, we live in a time where Biden managed to become the president of the US, pedos are literally proud about it on TV, and NPCs genuinely think that paying taxes is their personal choice. I assure you, if that's possible, everything is possible.&lt;/p&gt;

&lt;p&gt;Conslusion and my two cents&lt;br&gt;
The real quantum supremacy, then, is a quiet mind that no longer needs the universe to be a machine in order to feel safe in it. And that, more than any billion-dollar qubit, is what will decide how we operate and look into the future.&lt;/p&gt;

&lt;p&gt;A decade ago, I was describing, with a clarity that still unsettles me, the exact reality we now inhabit, everything from personal AI and quantum apps beyond theory, to remote genetic engineering, and mandated biotech trackers, you name it. Not because I'm a prophet or got lucky, but simply because I was certain. &lt;/p&gt;

&lt;p&gt;Everyone around me wished, hoped, craved, from flying cars to cured diseases, a return to nature that was against their lifestyle and obvious trajectory, to paper or screen backed wealth they thought would solve all their concerns. Things they wanted but were unsure they'd ever have. A gamble, a constant stress that leads to inevitable disappointment. I knew what was coming because the sequence was already set. All I had to do was read the first domino, and it showed me where the last would fall. Arguing in between is like a grandma yelling at a movie that has already been printed and running.&lt;/p&gt;

&lt;p&gt;Certainty shapes reality. A man without belief is no longer master of his thoughts, and therefore no longer author of his world. People who argue about God, quantum, science they don't understand, they're uncertain. Of everything. Their reality, themselves. If you expect these NPCs to agree with you, or tell you what is real, you've already lost your power to dictate physical and digital reality at will.&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>philosophy</category>
      <category>cybernetics</category>
      <category>physics</category>
    </item>
    <item>
      <title>How LLMs Now Monitor and Cut Their Own Token Spend</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Tue, 30 Jun 2026 15:29:53 +0000</pubDate>
      <link>https://dev.to/arpa/how-llms-now-monitor-and-cut-their-own-token-spend-ibg</link>
      <guid>https://dev.to/arpa/how-llms-now-monitor-and-cut-their-own-token-spend-ibg</guid>
      <description>&lt;p&gt;You have seen this loop before.&lt;/p&gt;

&lt;p&gt;An agent starts a “simple” task, say scrape listings, refactor a repo, research a market, or whatever. It fails, it retries, it re-reads context, it apologizes and tries all over again. Twenty minutes in and the dashboard shows six figures of tokens and zero useful outputs or deliverables.&lt;/p&gt;

&lt;p&gt;The model did not misbehave on purpose. The &lt;strong&gt;orchestrator&lt;/strong&gt; never had a hard budget gate with an ROI in mind.&lt;/p&gt;

&lt;p&gt;Skillware v0.4.0 ships a new skill for exactly that gap: &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/monitoring/token_limiter" rel="noopener noreferrer"&gt;&lt;code&gt;monitoring/token_limiter&lt;/code&gt;&lt;/a&gt;. It lets you &lt;strong&gt;monitor and limit any agent’s token budget in real time&lt;/strong&gt; — Gemini, Claude, OpenAI, DeepSeek, Ollama, custom Python loops, you name it. Same skill, same JSON, any runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Skillware is in a nutshell
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; is an open registry of &lt;strong&gt;installable agent capabilities&lt;/strong&gt;. Each skill is a bundle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;skill.py&lt;/code&gt;&lt;/strong&gt; — deterministic Python (&lt;code&gt;execute()&lt;/code&gt; returns JSON)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;instructions.md&lt;/code&gt;&lt;/strong&gt; — when the model should call the tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;manifest.yaml&lt;/code&gt;&lt;/strong&gt; — schema, constitution, issuer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests and docs&lt;/strong&gt; — shipped in the wheel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You load by ID, adapt for your provider, call &lt;code&gt;execute()&lt;/code&gt; on tool use. The model decides &lt;em&gt;when&lt;/em&gt;, the skill decides &lt;em&gt;how&lt;/em&gt;, predictably, every time.&lt;/p&gt;

&lt;p&gt;That split matters for budget control. You do not want the LLM guessing whether it is “allowed” to spend more tokens. You want a &lt;strong&gt;small, auditable function&lt;/strong&gt; that answers: continue, warn, or stop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet the &lt;code&gt;Token Limiter&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This skill is a &lt;strong&gt;budget gate&lt;/strong&gt;, not a kill switch wired into OpenAI or Anthropic.&lt;/p&gt;

&lt;p&gt;After each model turn, your host loop passes cumulative usage. The skill returns one of three actions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CONTINUE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Under the soft threshold — keep going&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WARN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Approaching the limit (default 80%) — tighten scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FORCE_TERMINATE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hard ceiling hit — &lt;strong&gt;stop the loop&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Important nuance: the skill &lt;strong&gt;does not&lt;/strong&gt; cancel API sessions or kill processes. It returns a structured decision. &lt;strong&gt;Your orchestrator must act on it.&lt;/strong&gt; That is by design — Skillware skills stay portable and provider-neutral.&lt;/p&gt;

&lt;p&gt;No skill-specific API keys. No network calls. Pure Python math on numbers you supply.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works in a real loop
&lt;/h2&gt;

&lt;p&gt;Picture a scrape task with a &lt;strong&gt;100,000 token&lt;/strong&gt; ceiling.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent runs turn 1 → host adds usage → calls &lt;code&gt;token_limiter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Turn 2, turn 3 — same pattern
&lt;/li&gt;
&lt;li&gt;At 85k tokens → &lt;code&gt;WARN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;At 105k → &lt;code&gt;FORCE_TERMINATE&lt;/code&gt; → host breaks the loop and surfaces the reason&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Minimal integration:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.loader&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;

&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monitoring/token_limiter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;module&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nc"&gt;TokenLimiterSkill&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scrape_listings_101&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_token_count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;125_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_allowed_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FORCE_TERMINATE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host tracks &lt;strong&gt;cumulative&lt;/strong&gt; &lt;code&gt;current_token_count&lt;/code&gt; from whatever provider you use — usage metadata from the API, a local tokenizer, or your own accounting layer. The skill does not read billing dashboards for you.&lt;/p&gt;

&lt;p&gt;Optional &lt;code&gt;model_id&lt;/code&gt; maps to bundled list prices for &lt;strong&gt;indicative USD&lt;/strong&gt; in the response. Handy for ops dashboards; not invoice-grade. Unknown models fall back to a blended rate with a warning in the payload.&lt;/p&gt;

&lt;p&gt;Optional &lt;code&gt;turn_id&lt;/code&gt; makes retries idempotent: same turn, same counts, same decision — no double-penalty if your loop replays a step.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture: Mind, Body, and a new category
&lt;/h2&gt;

&lt;p&gt;The skill lives under a new &lt;strong&gt;&lt;code&gt;monitoring/&lt;/code&gt;&lt;/strong&gt; category — room for more observability skills later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;budget.py&lt;/code&gt;&lt;/strong&gt; — pure evaluation logic (thresholds, cost estimate, ROI scaffold for v2)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;skill.py&lt;/code&gt;&lt;/strong&gt; — thin &lt;code&gt;BaseSkill&lt;/code&gt; wrapper, in-memory turn cache
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;instructions.md&lt;/code&gt;&lt;/strong&gt; — tells the agent: call this every turn; stop when you see &lt;code&gt;FORCE_TERMINATE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;data/model_pricing.json&lt;/code&gt;&lt;/strong&gt; — indicative rates for common models
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;v1 enforces &lt;strong&gt;token limits only&lt;/strong&gt;. ROI fields (&lt;code&gt;expected_outcome&lt;/code&gt;, &lt;code&gt;outcome_delivered&lt;/code&gt;, &lt;code&gt;roi_value_usd&lt;/code&gt;) are accepted as &lt;strong&gt;scaffold for v2&lt;/strong&gt; — outcome-aware gates later, without breaking the v1 contract today.&lt;/p&gt;

&lt;p&gt;Runnable examples ship in the repo: local loop simulation (&lt;code&gt;token_limiter_loop.py&lt;/code&gt;), plus Gemini and Claude harnesses. Install and try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;skillware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Catalog page: &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/token_limiter.md" rel="noopener noreferrer"&gt;docs/skills/token_limiter.md&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Chain it with other skills
&lt;/h2&gt;

&lt;p&gt;Budget control pairs naturally with &lt;strong&gt;&lt;code&gt;optimization/prompt_rewriter&lt;/code&gt;&lt;/strong&gt; — compress bloated context &lt;em&gt;before&lt;/em&gt; the main call, then cap spend &lt;em&gt;during&lt;/em&gt; the loop. Less waste in, hard ceiling out.&lt;/p&gt;

&lt;p&gt;Running agents against contracts or wallets? Screen first with &lt;strong&gt;&lt;code&gt;finance/wallet_screening&lt;/code&gt;&lt;/strong&gt;, execute with &lt;strong&gt;&lt;code&gt;defi/evm_tx_handler&lt;/code&gt;&lt;/strong&gt;, and keep &lt;strong&gt;&lt;code&gt;token_limiter&lt;/code&gt;&lt;/strong&gt; in the outer loop so a stuck DeFi agent cannot burn budget forever. Three skills, one NLP-driven pipeline, any supported model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Autonomous agents without token guardrails are expensive experiments. &lt;strong&gt;&lt;code&gt;monitoring/token_limiter&lt;/code&gt;&lt;/strong&gt; gives you a deterministic, testable answer to a simple question after every turn: &lt;em&gt;are we still within budget?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It ships in &lt;strong&gt;Skillware v0.4.0&lt;/strong&gt; today. Load it once, wire it into your loop, and stop paying for agents that retry themselves into oblivion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/monitoring/token_limiter" rel="noopener noreferrer"&gt;&lt;code&gt;monitoring/token_limiter&lt;/code&gt; source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ARPAHLS/skillware/releases/tag/v0.4.0" rel="noopener noreferrer"&gt;v0.4.0 release notes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/README.md" rel="noopener noreferrer"&gt;Skill library&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/usage/agent_loops.md" rel="noopener noreferrer"&gt;Agent loops guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions, issues, or skill ideas welcome in the repo. If you are building agent infra, start with a budget gate — your finance team will thank you later.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>agentskills</category>
      <category>skillware</category>
    </item>
    <item>
      <title>Any Agent or LLM Can Now Own A Wallet and Perform EVM TXs via NLP</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Mon, 29 Jun 2026 19:04:40 +0000</pubDate>
      <link>https://dev.to/rosspeili/any-agent-or-llm-can-now-own-a-wallet-and-perform-evm-txs-via-nlp-1o7p</link>
      <guid>https://dev.to/rosspeili/any-agent-or-llm-can-now-own-a-wallet-and-perform-evm-txs-via-nlp-1o7p</guid>
      <description>&lt;h1&gt;
  
  
  Your agent can own a wallet now — natural language to on-chain swaps on Ethereum, Base, and other EVM chains.
&lt;/h1&gt;

&lt;p&gt;Most agent demos stop at &lt;em&gt;reading&lt;/em&gt; the chain. You ask about a token, the model summarizes a blog post, everyone claps, and nothing moves on-chain.&lt;/p&gt;

&lt;p&gt;The new &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/defi/evm_tx_handler" rel="noopener noreferrer"&gt;&lt;code&gt;defi/evm_tx_handler&lt;/code&gt;&lt;/a&gt; skill in &lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; is aimed at a different loop: &lt;strong&gt;your agent holds its own EVM wallet&lt;/strong&gt;, turns plain-language trade intent into structured JSON, quotes a Uniswap V2 swap, shows a preview, and — only after confirmation — signs and broadcasts. No MetaMask popup. No pasting calldata into a block explorer. The LLM stays in natural language; the skill stays deterministic Python.&lt;/p&gt;

&lt;p&gt;This post walks through what that looks like in practice, how Skillware fits in, and how you might chain it with wallet screening before you send funds anywhere sketchy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skillware in a nutshell
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; is an open-source Python framework for packaging &lt;strong&gt;agent skills&lt;/strong&gt; the way you’d package a small library: one folder, one contract, works across providers.&lt;/p&gt;

&lt;p&gt;Each skill is a bundle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;skill.py&lt;/code&gt;&lt;/strong&gt; — deterministic logic (&lt;code&gt;execute()&lt;/code&gt;), no hallucinated math&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;manifest.yaml&lt;/code&gt;&lt;/strong&gt; — tool schema, env vars, constitution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;instructions.md&lt;/code&gt;&lt;/strong&gt; — how the &lt;em&gt;model&lt;/em&gt; should use the tool (flows, edge cases, safety)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;test_skill.py&lt;/code&gt;&lt;/strong&gt; — bundle tests that run in CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You load a skill once, adapt it for Gemini, Claude, OpenAI, or others via &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/skillware/core/loader.py" rel="noopener noreferrer"&gt;&lt;code&gt;SkillLoader&lt;/code&gt;&lt;/a&gt;, pass &lt;code&gt;instructions.md&lt;/code&gt; as system context, and wire tool calls to &lt;code&gt;skill.execute(...)&lt;/code&gt;. Same pattern everywhere — see the &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/introduction.md" rel="noopener noreferrer"&gt;introduction&lt;/a&gt; and &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/usage/agent_loops.md" rel="noopener noreferrer"&gt;agent loops guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That separation matters for DeFi: the model parses &lt;em&gt;“Buy 10 DEGEN on Base with USDC”&lt;/em&gt;; the skill parses &lt;strong&gt;nothing&lt;/strong&gt; in free text. It only accepts structured &lt;code&gt;action&lt;/code&gt; + &lt;code&gt;intent&lt;/code&gt; and returns JSON the agent can show to a human.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;evm_tx_handler&lt;/code&gt;: architecture in plain terms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Registry ID:&lt;/strong&gt; &lt;code&gt;defi/evm_tx_handler&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Issuer:&lt;/strong&gt; &lt;a href="https://github.com/Hendobox" rel="noopener noreferrer"&gt;@Hendobox&lt;/a&gt; · &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/evm_tx_handler.md" rel="noopener noreferrer"&gt;catalog page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The skill is built around a &lt;strong&gt;dedicated agent wallet&lt;/strong&gt; — not your personal MetaMask, not a treasury. You create a fresh key, fund it lightly, and put it in &lt;code&gt;.env&lt;/code&gt; as &lt;code&gt;AGENT_WALLET_PRIVATE_KEY&lt;/code&gt;. The constitution is explicit: &lt;em&gt;“Never pass keys in tool args, YAML, or logs.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Under the hood, &lt;code&gt;EvmTxHandlerSkill&lt;/code&gt; loads YAML registries from &lt;code&gt;data/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;chains.yaml&lt;/code&gt;&lt;/strong&gt; — today &lt;strong&gt;Ethereum mainnet&lt;/strong&gt; and &lt;strong&gt;Base&lt;/strong&gt; (chain IDs, RPC env keys, verified Uni V2 router addresses)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tokens.yaml&lt;/code&gt;&lt;/strong&gt; — symbol → contract per chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;addressbook.yaml&lt;/code&gt;&lt;/strong&gt; — human labels → addresses for transfers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Long-term defaults (default chain, slippage, &lt;code&gt;confirm_before_send&lt;/code&gt;, &lt;code&gt;max_trade_usd&lt;/code&gt;) live in &lt;code&gt;config.yaml&lt;/code&gt; (copy from &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/defi/evm_tx_handler" rel="noopener noreferrer"&gt;&lt;code&gt;config.yaml.example&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;
  
  
  Agent vs skill (the split that keeps you sane)
&lt;/h3&gt;

&lt;p&gt;From the skill’s &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/skills/defi/evm_tx_handler/instructions.md" rel="noopener noreferrer"&gt;&lt;code&gt;instructions.md&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You (agent)&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parse natural language into partial &lt;code&gt;intent&lt;/code&gt; JSON&lt;/td&gt;
&lt;td&gt;Merge intent with config and YAML registries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask for missing fields in plain language&lt;/td&gt;
&lt;td&gt;Return &lt;code&gt;missing_fields&lt;/code&gt; and &lt;code&gt;suggested_defaults&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Show &lt;code&gt;preview&lt;/code&gt; to the user and obtain approval&lt;/td&gt;
&lt;td&gt;Build on-chain quotes; sign swaps and transfers when confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass &lt;code&gt;confirmed: true&lt;/code&gt; after approval&lt;/td&gt;
&lt;td&gt;Approve (if needed), swap, or transfer; return tx hash + receipt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So the NLP layer is the LLM. The signing layer is Web3.py inside the skill, using the agent wallet key from the environment — not from the chat thread.&lt;/p&gt;
&lt;h3&gt;
  
  
  Actions you actually call
&lt;/h3&gt;

&lt;p&gt;The manifest defines eight operations: &lt;code&gt;resolve&lt;/code&gt;, &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt;, &lt;code&gt;execute&lt;/code&gt;, &lt;code&gt;transfer&lt;/code&gt;, &lt;code&gt;balances&lt;/code&gt;, &lt;code&gt;wallet_info&lt;/code&gt;, &lt;code&gt;update_preferences&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A typical &lt;strong&gt;buy flow&lt;/strong&gt; (from the skill docs):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User: &lt;em&gt;“Buy 10 Degen on Base with USDC.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;resolve&lt;/code&gt; with intent like:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;side&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;buy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_asset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;degen&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount_kind&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;spend_asset&lt;/code&gt; is missing, the skill returns &lt;code&gt;missing_fields&lt;/code&gt; — the agent asks the user, then continues.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quote&lt;/code&gt; / &lt;code&gt;preview&lt;/code&gt; — live Uni V2 math, optional USD via CoinGecko if you set &lt;code&gt;COINGECKO_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;User approves in plain language.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;execute&lt;/code&gt; with the &lt;strong&gt;same intent&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;confirmed: true&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Important nuance (easy to miss): &lt;strong&gt;&lt;code&gt;execute&lt;/code&gt; re-quotes on-chain at broadcast time.&lt;/strong&gt; Preview amounts can drift. The skill warns you to call &lt;code&gt;quote&lt;/code&gt; or &lt;code&gt;preview&lt;/code&gt; immediately before confirmation — not five minutes earlier.&lt;/p&gt;

&lt;p&gt;For ERC20 spends, you may get a &lt;strong&gt;two-step flow&lt;/strong&gt;: &lt;code&gt;approve&lt;/code&gt; tx, then swap. If the response includes &lt;code&gt;approve_tx_hash&lt;/code&gt;, tell the user both hashes landed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Copy-paste: load the skill and run a Gemini loop
&lt;/h2&gt;

&lt;p&gt;Install Skillware and deps (&lt;code&gt;web3&amp;gt;=6&lt;/code&gt;), set RPC URLs and the agent wallet key, then:&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.genai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.env&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_env_file&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skillware.core.loader&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;

&lt;span class="nf"&gt;load_env_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defi/evm_tx_handler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;module&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nc"&gt;EvmTxHandlerSkill&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_gemini_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;side&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;buy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_asset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;degen&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spend_asset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usdc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount_kind&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resolve and quote a buy of 10 DEGEN on Base with USDC.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;system_instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instructions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# On function_call: skill.execute({"action": ..., "intent": ...})
# After preview + user approval:
# skill.execute({"action": "execute", "intent": intent, "confirmed": True})
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No keys in the prompt. No MetaMask. The model never sees your private key — only the skill reads &lt;code&gt;AGENT_WALLET_PRIVATE_KEY&lt;/code&gt; from the environment.&lt;/p&gt;

&lt;p&gt;Want to try the flow without mainnet? The repo ships runnable examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;EVM_TX_HANDLER_EXAMPLE_DEMO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 python examples/gemini_evm_tx_handler.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/examples/gemini_evm_tx_handler.py" rel="noopener noreferrer"&gt;&lt;code&gt;examples/gemini_evm_tx_handler.py&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/examples/claude_evm_tx_handler.py" rel="noopener noreferrer"&gt;&lt;code&gt;examples/claude_evm_tx_handler.py&lt;/code&gt;&lt;/a&gt; in the &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/examples/README.md" rel="noopener noreferrer"&gt;examples index&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Safety rails (built into the skill, not bolted on later)
&lt;/h2&gt;

&lt;p&gt;A few things the skill enforces so agents don’t YOLO on-chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;confirm_before_send&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;execute&lt;/code&gt; / &lt;code&gt;transfer&lt;/code&gt; blocked until &lt;code&gt;confirmed: true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balance pre-checks&lt;/strong&gt; — insufficient funds return &lt;code&gt;status: insufficient_balance&lt;/code&gt; before broadcast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;max_trade_usd&lt;/code&gt;&lt;/strong&gt; — fail closed if USD price unavailable when a cap is set&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constitution&lt;/strong&gt; — dedicated wallet only, not financial advice, fail closed on missing RPC or registry entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skill itself recommends pairing with &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/skills/finance/wallet_screening" rel="noopener noreferrer"&gt;&lt;code&gt;finance/wallet_screening&lt;/code&gt;&lt;/a&gt; before large sends to unknown addresses — screening runs locally in one &lt;code&gt;execute()&lt;/code&gt; call (sanctions, malicious interaction counts, PnL context). That’s a natural &lt;strong&gt;chain&lt;/strong&gt;: screen a recipient or counterparty wallet first; only if the report looks acceptable, call &lt;code&gt;transfer&lt;/code&gt; or &lt;code&gt;execute&lt;/code&gt; on the tx handler.&lt;/p&gt;

&lt;p&gt;Same agent loop, two tools, one conversation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User: &lt;em&gt;“Send 0.5 ETH to 0xABC… but check if it’s safe first.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;wallet_screening&lt;/code&gt; with the address.&lt;/li&gt;
&lt;li&gt;Agent summarizes &lt;code&gt;summary.sanctioned_entity_match&lt;/code&gt;, &lt;code&gt;summary.malicious_interaction_count&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;If clean (and user still wants to proceed), agent calls &lt;code&gt;evm_tx_handler&lt;/code&gt; → &lt;code&gt;transfer&lt;/code&gt; with preview → user confirms → &lt;code&gt;confirmed: true&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both skills load through the same &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/skillware/core/loader.py" rel="noopener noreferrer"&gt;&lt;code&gt;SkillLoader&lt;/code&gt;&lt;/a&gt; pattern; you’re composing capabilities, not rewriting provider-specific tool JSON from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limits (honest ones)
&lt;/h2&gt;

&lt;p&gt;Today this skill is &lt;strong&gt;Uniswap V2 only&lt;/strong&gt;, on &lt;strong&gt;Ethereum + Base&lt;/strong&gt; (see &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/skills/defi/evm_tx_handler/data/chains.yaml" rel="noopener noreferrer"&gt;&lt;code&gt;data/chains.yaml&lt;/code&gt;&lt;/a&gt;). No bridges, no aggregators, no Polygon router in the registry yet — adding chains is a YAML + verification exercise, not magic NLP.&lt;/p&gt;

&lt;p&gt;Natural language can still be mis-parsed. Preview drift is real. Market risk is real. The skill gives you structure, signing, and guardrails; it doesn’t replace human judgment on whether a trade makes sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill source:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/skillware/tree/main/skills/defi/evm_tx_handler" rel="noopener noreferrer"&gt;skills/defi/evm_tx_handler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/skills/evm_tx_handler.md" rel="noopener noreferrer"&gt;evm_tx_handler.md&lt;/a&gt; · &lt;a href="https://github.com/ARPAHLS/skillware/blob/main/docs/usage/api_keys.md" rel="noopener noreferrer"&gt;API keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; &lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;github.com/ARPAHLS/skillware&lt;/a&gt; · &lt;code&gt;pip install skillware&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;skillware.site&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’ve been wiring one-off Web3 tools per provider, this is the other path: one skill bundle, any agent, one wallet the agent actually controls — with previews, confirmations, and screening chained in when you need them.&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>ai</category>
      <category>agentskills</category>
      <category>skillware</category>
    </item>
    <item>
      <title>Skillware Crosses 8,000 OS Deployments and Goes Enterprise</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Mon, 29 Jun 2026 07:52:36 +0000</pubDate>
      <link>https://dev.to/arpa/skillware-crosses-8000-os-deployments-and-goes-enterprise-2lm5</link>
      <guid>https://dev.to/arpa/skillware-crosses-8000-os-deployments-and-goes-enterprise-2lm5</guid>
      <description>&lt;p&gt;Numbers reflect adoption, but architecture dictates reality. As of this week, the open-source releases of our Skillware packages have surpassed 8,000 downloads across PyPi, according to [PyPI Stats (&lt;a href="https://pypistats.org/packages/skillware" rel="noopener noreferrer"&gt;https://pypistats.org/packages/skillware&lt;/a&gt;) and &lt;a href="https://pepy.tech/projects/skillware" rel="noopener noreferrer"&gt;PePy&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;For those who have been tracking our &lt;a href="https://github.com/arpahls/skillware" rel="noopener noreferrer"&gt;commits&lt;/a&gt; at ARPA, you know the premise of &lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; was never about simply wrapping standard LLM APIs. We are engineering installable intelligence—modular, agentic AI microservices designed to give autonomous models the concrete ability to execute complex, verifiable actions across legacy systems. The first phase was about establishing the baseline. We deployed the atomic functions, and the developer community battle-tested the logic. &lt;/p&gt;

&lt;p&gt;Now, we elevate the stack. &lt;/p&gt;

&lt;p&gt;The baseline is stable. The next phase for Logical Industries requires shifting from atomic open-source functions to deeply chained, enterprise-tier cognitive workflows. We are moving beyond models that merely synthesize information, toward agents that structurally optimize operational reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Transition to Enterprise Skillware
&lt;/h3&gt;

&lt;p&gt;Standardization is the enemy of competitive advantage. To build the infrastructure for true man-machine symbiosis, AI agents must possess highly specialized, industry-specific capabilities. Whether it is a compliance model cross-referencing KYC documentation with steganographic malware checks (similar to our deployments for the financial and compliance sectors), or a financial agent executing multi-layered smart contract audits, the demand for sophisticated "skill chaining" is absolute.&lt;/p&gt;

&lt;p&gt;We are not guessing what the industry needs. We are extracting the parameters directly from the source. &lt;/p&gt;

&lt;h3&gt;
  
  
  Initiating the Vanguard Cohort
&lt;/h3&gt;

&lt;p&gt;To architect the first wave of Enterprise Skillware, we are opening a closed co-development cycle with our closest network partners and top-tier industry operators. We call it the Vanguard Cohort.&lt;/p&gt;

&lt;p&gt;The protocol is straightforward: We want to identify the heaviest friction points and operational bottlenecks within your specific sector—be it Web3, bioinformatics, logistics, or decentralized finance. &lt;/p&gt;

&lt;p&gt;Tell us the exact, native AI capability that would fundamentally upgrade your workflow. If your proposal defines a critical industry gap, ARPA will engineer, chain, and implement that custom skill for your internal agents entirely at zero cost. Furthermore, your organization will be permanently integrated and credited as a co-author of the skill.&lt;/p&gt;

&lt;p&gt;We engineer the bypass; you keep the operational leverage. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to participate:&lt;/strong&gt;&lt;br&gt;
If you operate at the enterprise level and have a precise bottleneck that requires an algorithmic solution, submit your operational parameters via the secure brief below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://forms.gle/UugQzpk7uraeBU4j7" rel="noopener noreferrer"&gt;&lt;strong&gt;Fill the cohort form&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The era of generic AI is closing. The future belongs to custom, self-executing logic. Define reality.&lt;/p&gt;

</description>
      <category>skillware</category>
      <category>agentskills</category>
      <category>localai</category>
      <category>ai</category>
    </item>
    <item>
      <title>Simulating Antiferromagnets with PennyLane: A Deep Dive into spinq-vqe</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Fri, 26 Jun 2026 05:32:08 +0000</pubDate>
      <link>https://dev.to/arpa/simulating-antiferromagnets-with-pennylane-a-deep-dive-into-spinq-vqe-3lim</link>
      <guid>https://dev.to/arpa/simulating-antiferromagnets-with-pennylane-a-deep-dive-into-spinq-vqe-3lim</guid>
      <description>&lt;p&gt;Quantum Machine Learning (QML) is rapidly moving from theoretical whitepapers into practical engineering pipelines. If you are curious about how quantum algorithms actually interface with material science, the newly open-sourced &lt;a href="https://github.com/ARPAQLS/spinq-vqe" rel="noopener noreferrer"&gt;&lt;code&gt;spinq-vqe&lt;/code&gt;&lt;/a&gt; repository from ARPA's QONDRA division is a perfect sandbox.&lt;/p&gt;

&lt;p&gt;Built entirely in Python using &lt;a href="https://pennylane.ai/" rel="noopener noreferrer"&gt;PennyLane&lt;/a&gt;, &lt;code&gt;spinq-vqe&lt;/code&gt; tackles the quantum many-body physics of Mn₃Sn. For context, Mn₃Sn is a Kagome antiferromagnet that recently demonstrated ultra-fast 40-picosecond spin-orbit torque switching. Simulating the ground state of its highly correlated Kagome lattice is notoriously difficult for classical systems, making it an ideal candidate for quantum variational methods.&lt;/p&gt;

&lt;p&gt;Here is a breakdown of what makes this repository worth cloning, whether you are a QML researcher or a classical software engineer looking to bridge the gap into quantum systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. VQE and the Barren Plateau Problem in the Wild
&lt;/h3&gt;

&lt;p&gt;One of the most valuable aspects of this repo is its transparent handling of algorithmic bottlenecks. In &lt;a href="https://github.com/ARPAQLS/spinq-vqe/blob/master/notebooks/02_vqe_run.ipynb" rel="noopener noreferrer"&gt;&lt;code&gt;notebooks/02_vqe_run.ipynb&lt;/code&gt;&lt;/a&gt;, the pipeline attempts to find the system's ground state using a Variational Quantum Eigensolver (VQE) with a Hardware Efficient Ansatz (HEA).&lt;/p&gt;

&lt;p&gt;If you run the simulation using a standard Adam optimizer, the training completely stalls out. Why? The initial $|0\rangle^{\otimes N}$ state is a Z-basis eigenstate. Due to the SU(2) symmetry of the Heisenberg Hamiltonian, the quantum gradients cancel out to exactly zero, trapping your model in a barren plateau. The repository demonstrates how swapping to COBYLA—a gradient-free optimizer that evaluates the cost function directly—neatly bypasses this trap, achieving a 9.66% error rate against Exact Diagonalization (ED) on a 9-qubit system. &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hybrid Quantum-Classical Material Screening
&lt;/h3&gt;

&lt;p&gt;Quantum computing doesn't exist in a vacuum, and this repository showcases a brilliantly practical hybrid pipeline in &lt;a href="https://github.com/ARPAQLS/spinq-vqe/blob/master/notebooks/04_soc_qaoa.ipynb" rel="noopener noreferrer"&gt;&lt;code&gt;notebooks/04_soc_qaoa.ipynb&lt;/code&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;To screen materials for optimal Spin-Orbit Coupling (SOC), the pipeline first trains a classical Multi-Layer Perceptron (MLP) to predict spin Hall angles. This classical model then acts as an oracle for a Quantum Approximate Optimization Algorithm (QAOA). At a shallow circuit depth of $p=2$, the QAOA successfully converges on the optimal global material trio: Mn₃Sn, CrTe₂, and Bi₂Se₃. It’s a clean blueprint for blending classical ML with quantum optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Entanglement Profiling
&lt;/h3&gt;

&lt;p&gt;The Kagome lattice is famous in physics for hosting quantum spin liquids. The &lt;a href="https://github.com/ARPAQLS/spinq-vqe/tree/master/src/spinq_vqe" rel="noopener noreferrer"&gt;&lt;code&gt;spinq-vqe&lt;/code&gt; source code&lt;/a&gt; includes robust modules to calculate Von Neumann entropy and mutual information, allowing you to mathematically verify the strong, non-local quantum correlations across the sublattices directly from your simulated statevectors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Started
&lt;/h3&gt;

&lt;p&gt;The architecture is clean, highly modular, and heavily documented. You can read the &lt;a href="https://github.com/ARPAQLS/spinq-vqe/tree/master/docs" rel="noopener noreferrer"&gt;full physics background, ansatz guides, and API documentation in the &lt;code&gt;/docs&lt;/code&gt; directory&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further Reading &amp;amp; Literature&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The methodology implemented in this codebase relies on foundational quantum mechanics and QML literature. Key citations operationalized in the repo include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cerezo, M. et al. (2021). &lt;em&gt;Cost function dependent barren plateaus in shallow parametrized quantum circuits&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Farhi, E. et al. (2014). &lt;em&gt;A Quantum Approximate Optimization Algorithm&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Kandala, A. et al. (2017). &lt;em&gt;Hardware-efficient variational quantum eigensolver for small molecules and quantum magnets&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Yan, S., Huse, D. A., &amp;amp; White, S. R. (2011). &lt;em&gt;Spin-liquid ground state of the S=1/2 Kagome Heisenberg antiferromagnet&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the code, run the notebooks, and see firsthand how quantum simulations are mapping the spintronic hardware of tomorrow.&lt;/p&gt;

</description>
      <category>quantumcomputing</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>physics</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Mon, 15 Jun 2026 14:30:42 +0000</pubDate>
      <link>https://dev.to/rosspeili/-3l53</link>
      <guid>https://dev.to/rosspeili/-3l53</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5" class="crayons-story__hidden-navigation-link"&gt;Skillware Just Dropped a Skill That Lets Your Agent Solve Any GitHub Issue in One Prompt&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/rosspeili" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F308648%2Fe3062c7b-4d7d-4ba9-aea5-f0ea4fef4776.jpg" alt="rosspeili profile" class="crayons-avatar__image" width="400" height="400"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rosspeili" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ross Peili
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ross Peili
                
              
              &lt;div id="story-author-preview-content-3777514" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/rosspeili" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F308648%2Fe3062c7b-4d7d-4ba9-aea5-f0ea4fef4776.jpg" class="crayons-avatar__image" alt="" width="400" height="400"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ross Peili&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5" id="article-link-3777514"&gt;
          Skillware Just Dropped a Skill That Lets Your Agent Solve Any GitHub Issue in One Prompt
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/skillware"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;skillware&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agentskills"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agentskills&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/arpa"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;arpa&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/localai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;localai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Our OS AI skills framework is actually getting some heat - new contributors welcome &lt;3</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Mon, 15 Jun 2026 07:51:55 +0000</pubDate>
      <link>https://dev.to/rosspeili/our-os-ai-skills-framework-is-actually-getting-some-heat-new-contributors-welcome-3-43c0</link>
      <guid>https://dev.to/rosspeili/our-os-ai-skills-framework-is-actually-getting-some-heat-new-contributors-welcome-3-43c0</guid>
      <description>&lt;p&gt;Today, we released Skillware v0.3.6, Skillware is basiclaly an open-source framework for packaging Python capabilities (wallet screening, PDF tools, compliance checks, etc.) as skills agents call via normal tool APIs, instead of generating one-off code each time.&lt;/p&gt;

&lt;p&gt;This release is mostly contributor-facing: CLI works out of the box (&lt;code&gt;pip install skillware&lt;/code&gt;, &lt;code&gt;python -m skillware&lt;/code&gt; fallback), clearer help, CI runs bundle tests under &lt;code&gt;skills/&lt;/code&gt;, and a small &lt;code&gt;wallet_screening&lt;/code&gt; fix, and this made me pause for a moment and be grateful of all the contributors and what we've built.&lt;/p&gt;

&lt;p&gt;Today, we have over 40 stars and 12 contributors from all over the world. I know it might sound like nothing to some, but we started from zero, and slowly built this upwards together. I won't explain here why Skillware is better than agent skills, you can check the docs or read articles about it, but I wanna share why I am so excited about these numbers, even tho again, to some they might sound non worthy of hype.&lt;/p&gt;

&lt;p&gt;Initially, we built skillware having machines in mind. Most people are building AI, apps, services, tools, products, targeting humans. But in 2026, AI is your core audience, the one that makes up more than half of the internet traffic. I mean, even when humans dyor they essentially employ an AI to do the search, even when you google things, AI is replying. So, the idea was to make Skillware easily accessible, discoverable, parsable, testable, and usable by LLMs and AI Agents with 0 friction.&lt;/p&gt;

&lt;p&gt;We built the website in a way that makes it easy for agents to find, browse skills, find skills they need, and use them out of the box with one code block, no matter which model or framework they are coming from.&lt;/p&gt;

&lt;p&gt;On top of that, our repo is not only AI friendly, but AI focused. YES! we expect that everyone is using AI tools, code assitsants and AI enabled IDEs. There is no excuse to not do it in 2026. Our repo is build in such a way, that literally any agent or model can understand it instantly and start solving issues with single shots, without back and forths, without breaking files, or ignoring important ripple effects or complementary files etc.&lt;/p&gt;

&lt;p&gt;I take this moment to celebrate Skillware. Even if I am celebrating alone ❤️ and I would like to welcome anyone who wants to contribute to open source AI, or sharpen their python skills to join us and give it a spin, not just a project/tool, but also as modern clean cut repo tailored for agents at work. Lots of good first issues, as well as complex and sophisticated skill bundles that are not just silly md prompts.&lt;/p&gt;

&lt;p&gt;You can check the repo at &lt;a href="https://github.com/arpahls/skillware" rel="noopener noreferrer"&gt;arpahls/skillware&lt;/a&gt;, install with pip install skillware, or visit &lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;skillware.site&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>skillware</category>
      <category>agentskills</category>
      <category>ai</category>
    </item>
    <item>
      <title>Skillware Just Dropped a Skill That Lets Your Agent Solve Any GitHub Issue in One Prompt</title>
      <dc:creator>Ross Peili</dc:creator>
      <pubDate>Fri, 29 May 2026 10:27:54 +0000</pubDate>
      <link>https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5</link>
      <guid>https://dev.to/rosspeili/skillware-just-dropped-a-skill-that-lets-your-agent-solve-any-github-issue-in-one-prompt-4jp5</guid>
      <description>&lt;h1&gt;
  
  
  I Let Two AI Agents Fix the Same GitHub Issue, One Took 7 Tries, the Other Nailed It in One Shot
&lt;/h1&gt;

&lt;p&gt;Yes, I know. Most of us already use AI coding tools. Cursor, Antigravity, you name it, they're all pretty good at autocompleting a function or generating a quick boilerplate. But here's the thing: I tested &lt;a href="https://www.anthropic.com" rel="noopener noreferrer"&gt;Claude 4.7 Opus&lt;/a&gt; via &lt;a href="https://cursor.sh" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, and a local &lt;a href="https://ollama.com/library/qwen" rel="noopener noreferrer"&gt;Qwen 3.5&lt;/a&gt; running through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, which was also armed with &lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt;'s new &lt;strong&gt;Issue Resolver&lt;/strong&gt; skill. The results were shockingly surprising, and I genuinly did not expected that myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I grabbed a real GitHub issue, not a trivial typo fix, but a moderately complex bug that touched several files, had downstream ripple effects, and required documentation and versioning updates that weren't obvious from the issue description alone. So you would normally have to manually dig deeper, compare changes, etc. The kind of thing where the fix itself is straightforward, but getting it &lt;em&gt;right&lt;/em&gt; means touching half a dozen places most people, and even AI IDE agents would overlook.&lt;/p&gt;

&lt;p&gt;Then I let both agents take a crack at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Opus went first, and it did fine. Eventually.
&lt;/h2&gt;

&lt;p&gt;Opus dived in exactly how you'd expect a capable but eager junior dev to behave. It read the issue, found the most obvious place to patch, and implemented a minimal fix. Good. But then I noticed it hadn't updated the tests. So I had to do a follow up prompt. Then it forgot the docs. Another prompt. Then I spotted a version bump that should've happened. Prompt again. Then a related config file that referenced the changed behavior. Another prompt, and you get the gist.&lt;/p&gt;

&lt;p&gt;All in all, it took &lt;strong&gt;seven back-and-forth exchanges&lt;/strong&gt; to get everything right. Each iteration was fast, and the code quality was solid, but I had to steer the ship manually after every step. Opus wasn't thinking holistically. It was treating the issue like a surgical strike on one file, blind to everything else that needed to change. That's not a Claude problem, buw what happens when an agent jumps straight to implementation without pausing to think. Sure it had an implementation plan and parsed the repo and all, before working, but still didn't sweep everything as expected. At least not without micromanaging it like a corporate watchdog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Qwen 3.5 with Skillware had a go
&lt;/h2&gt;

&lt;p&gt;Same issue. Same repo. But this time, the agent was using &lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;Skillware's Issue Resolver&lt;/a&gt;, a new skill that forces a structured analysis phase &lt;em&gt;before&lt;/em&gt; any code gets written. Instead of rushing to the fix, the agent first fetched the issue, read the repo's readme, code of conduct, contributing, etc, scanned the directory tree, and mapped every file that could possibly be affected.&lt;/p&gt;

&lt;p&gt;Then it didn't just presented a plan. Here's what's broken. Here are the acceptance criteria. Here are the files that need to change, including tests, docs, config, and downstream modules you might not have thought about. Here are three ways to fix it, ranked by risk and complexity. I picked one, approved it, and the agent implemented the whole thing in one go, including local testing, linting, formatting, and all the complementary changes that would make it sail through a PR review instantly. It also created a branch, ensured there are no co authors in commit, pushed the commit, all in one go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One shot.&lt;/strong&gt; No nudges. No "oh wait, you forgot the..."&lt;/p&gt;

&lt;p&gt;And here's the part that matters: this isn't about Qwen being better than Claude or whatever model fights make up the headlines these days. Don't get me wrong, Opus is an incredible model. The difference was entirely in the &lt;em&gt;workflow&lt;/em&gt;. Opus without Issue Resolver behaved like a brilliant developer who skipped the planning meeting. Qwen with Issue Resolver behaved like a senior engineer who thought through the whole problem before touching the keyboard, evaluated his changes, tested the changes before shipping, shipped only when it was 101% sure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Issue Resolver actually does
&lt;/h2&gt;

&lt;p&gt;The idea is simple. Most AI agents are optimized to &lt;em&gt;produce&lt;/em&gt;, eg. give them a prompt, they generate code. But for non-trivial issues, producing code immediately is often the wrong move. What you actually need first is understanding, scoping, and a plan.&lt;/p&gt;

&lt;p&gt;The Issue Resolver skill, part of the &lt;a href="https://skillware.site" rel="noopener noreferrer"&gt;Skillware&lt;/a&gt; open-source framework, enforces exactly that in a five-stage fashion:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fetch&lt;/strong&gt; the issue, comments, and linked PRs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand&lt;/strong&gt; the repository by reading its actual README, CONTRIBUTING guide, and directory tree at runtime — no hardcoded assumptions about what kind of project it is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze&lt;/strong&gt; the problem, define what "done" looks like, map every file that needs to change, trace ripple effects into dependent modules, and rank up to three implementation options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Present the plan&lt;/strong&gt; and wait for your approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement&lt;/strong&gt; but only after you say go, and only within the bounds of the approved plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output is a structured resolution plan you can actually review. Affected files. Downstream risks. A recommended approach with rationale. It turns a chaotic "fix this issue" prompt into a disciplined, reviewable workflow that catches the tests, docs, and version bumps before they become "oh right, forgot that" moments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;If you're a developer, this is like having a teammate who does the legwork before the standup. You show up, they've already read the issue, explored the codebase, and handed you a breakdown of what needs to happen. You just make decisions.&lt;/p&gt;

&lt;p&gt;If you're building AI agent workflows, it's a reusable planning scaffold. Instead of your agent raw-dogging every issue and hoping for the best, Issue Resolver gives it structure. The result is fewer iterations, fewer regressions, and output that reads like a human thought about it first.&lt;/p&gt;

&lt;p&gt;Most importantly, it was made to work locally with local models, no cloud inference reliance or top shelf LLM credits. You can literally pair it with a 3B model and get better results than LLM darlings, not cause the model is "smarter" or whatever, but cause it knows exactly how to fetch issues, repos, how to parse them, how to make sure changes won't affect files out of scope, and if they do, it is aware and knows how to behave. Moreover, it will test, evaluate, and ensure everything is sound before shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;What this experiment really drove home for me is that &lt;strong&gt;process matters more than model size&lt;/strong&gt;. We spend so much time comparing benchmarks and parameter counts, but the gap between "seven back-and-forths with manual steering" and "one shot, PR-ready" wasn't closed by a bigger model. It was closed by a better workflow. The Issue Resolver skill is just a structured way of saying: slow down, think first, then act.&lt;/p&gt;

&lt;p&gt;Please, feel free to contribute, it's 100% free and open source, and we are planning to enhance the skill with more features and pit stops for evals, eg. considering commit messages, parsing previous relevant issues and prs that are closed, and seamlessly managing git without assumptions or user input.&lt;/p&gt;

&lt;p&gt;If you just want to try it yourself, the skill is available now at &lt;a href="https://github.com/ARPAHLS/skillware" rel="noopener noreferrer"&gt;github.com/ARPAHLS/skillware&lt;/a&gt; or simply pip install skillware. Plug in a GitHub issue URL, optionally toss in your &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; and any project-specific instructions, and see how your favorite agent performs when it's forced to plan before it codes. I'd genuinely love to hear what happens. &amp;lt;3&lt;/p&gt;

</description>
      <category>skillware</category>
      <category>agentskills</category>
      <category>arpa</category>
      <category>localai</category>
    </item>
  </channel>
</rss>
