<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Médéric Hurier (Fmind)</title>
    <description>The latest articles on DEV Community by Médéric Hurier (Fmind) (@fmind).</description>
    <link>https://dev.to/fmind</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%2F3755461%2F73737e36-504a-410b-a602-b481116b3257.png</url>
      <title>DEV Community: Médéric Hurier (Fmind)</title>
      <link>https://dev.to/fmind</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fmind"/>
    <language>en</language>
    <item>
      <title>MCP 2026–07–28: Stateless core, enterprise authorization, and SDK betas</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Wed, 08 Jul 2026 04:54:59 +0000</pubDate>
      <link>https://dev.to/fmind/mcp-2026-07-28-stateless-core-enterprise-authorization-and-sdk-betas-od8</link>
      <guid>https://dev.to/fmind/mcp-2026-07-28-stateless-core-enterprise-authorization-and-sdk-betas-od8</guid>
      <description>&lt;p&gt;Running a remote &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; (MCP) server behind multiple instances presents immediate infrastructure challenges. Because the original spec requires an initialize handshake and pins sessions to a specific instance via the Mcp-Session-Id header, you are forced to configure sticky routing or a shared session store at the load balancer level. This makes scaling beyond a single process unnecessarily complex.&lt;/p&gt;

&lt;p&gt;To address these limitations, the MCP project released three updates in mid-2026: a &lt;a href="https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/" rel="noopener noreferrer"&gt;release candidate for the 2026–07–28 specification&lt;/a&gt;, a stable &lt;a href="https://blog.modelcontextprotocol.io/posts/enterprise-managed-auth/" rel="noopener noreferrer"&gt;enterprise-managed authorization extension&lt;/a&gt;, and &lt;a href="https://blog.modelcontextprotocol.io/posts/sdk-betas-2026-07-28/" rel="noopener noreferrer"&gt;beta SDKs&lt;/a&gt; across Python, TypeScript, Go, and C#.&lt;/p&gt;

&lt;p&gt;Together, these changes address three core production challenges: stateless scaling, centralized identity management, and protocol version stability.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ATB-QR2zo9uvhyEg0" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ATB-QR2zo9uvhyEg0" width="1024" height="683"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Robynne O on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Stateless core: scaling without handshakes
&lt;/h3&gt;

&lt;p&gt;The 2026–07–28 specification removes the stateful handshake and session management. The initialize/initialized handshake is gone, and so is the protocol-level session. Client information, protocol version, and capabilities now travel in a request’s _meta field on every call, making each request self-describing.&lt;/p&gt;

&lt;p&gt;This allows remote servers to run behind standard round-robin load balancers without session affinity or synchronization. Any instance can answer any request without first replaying a handshake or looking up shared session state.&lt;/p&gt;

&lt;p&gt;A standard tool call now requires no prior initialization and carries all context self-contained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/mcp&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Protocol-Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026–07–28&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tools/call&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search&lt;/span&gt;
&lt;span class="na"&gt;{"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"2.0","id":1,"method":"tools/call",&lt;/span&gt;
&lt;span class="na"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;{"name":"search","arguments":{"q":"otters"},&lt;/span&gt;
&lt;span class="na"&gt;"_meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;{"io.modelcontextprotocol/protocolVersion":"2026–07–28",&lt;/span&gt;
&lt;span class="na"&gt;"io.modelcontextprotocol/clientInfo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;{"name":"my-app","version":"1.0"}}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The _meta block carries the client identity and protocol version. The Mcp-Method and Mcp-Name HTTP headers allow load balancers or gateways to route the call without parsing the JSON payload body.&lt;/p&gt;

&lt;p&gt;Because the protocol is now stateless, servers can no longer interrupt an active connection to request input. Instead, the spec introduces Multi Round-Trip Requests. When a tool requires input, the server returns an InputRequiredResult containing an opaque requestState. The client must then re-invoke the tool call, passing the user’s input alongside the requestState token. This design allows any available instance to process the response without holding a connection open.&lt;/p&gt;

&lt;p&gt;This stateless model increases request payload sizes because client capabilities and session parameters must be transmitted with each call. However, it enables standard production features: full JSON Schema 2020–12 validation, cache-control hints (ttlMs and cacheScope), W3C Trace Context propagation for OpenTelemetry, and a modular extensions framework. The first two official extensions are MCP Apps (sandboxed HTML-based user interfaces) and a stateless version of Tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Centralized identity: enterprise-managed authorization
&lt;/h3&gt;

&lt;p&gt;Beyond horizontal scaling, managing MCP server access across a team requires central authorization. The standard per-user OAuth flow forces every employee to authorize each MCP server individually, which complicates onboarding, lacks centralized audit logs, and mixes personal and corporate access.&lt;/p&gt;

&lt;p&gt;To address this, the enterprise-managed authorization extension (stabilized in June 2026) implements the &lt;a href="https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/" rel="noopener noreferrer"&gt;Identity Assertion JWT Authorization Grant&lt;/a&gt; (ID-JAG). During single sign-on (SSO), the client trades the user’s identity token for an ID-JAG scoped to a specific target server via &lt;a href="https://www.rfc-editor.org/rfc/rfc8693" rel="noopener noreferrer"&gt;RFC 8693&lt;/a&gt; token exchange. The client then presents this grant to the MCP server’s authorization server to obtain an access token. This token exchange runs entirely in the background, removing the need for individual interactive consent screens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. IdP: swap the SSO identity for a grant good only for one MCP server
&lt;/span&gt;&lt;span class="py"&gt;grant_type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;urn:ietf:params:oauth:grant-type:token-exchange&lt;/span&gt;
&lt;span class="py"&gt;requested_token_type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;urn:ietf:params:oauth:token-type:id-jag&lt;/span&gt;
&lt;span class="py"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://mcp.example/ # the specific server this grant targets&lt;/span&gt;
&lt;span class="py"&gt;subject_token&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;the user's SSO id_token&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# 2. MCP authorization server: swap that grant for the server's access token
&lt;/span&gt;&lt;span class="py"&gt;grant_type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;urn:ietf:params:oauth:grant-type:jwt-bearer&lt;/span&gt;
&lt;span class="py"&gt;assertion&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;the ID-JAG returned by step 1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access control is governed by the organization’s existing identity provider (IdP) groups and roles. Administrators can configure permissions from a single control plane, and all access generates centralized audit trails.&lt;/p&gt;

&lt;p&gt;This extension is additive and opt-in. The default remains per-user OAuth for consumer configurations. MCP servers advertise support for enterprise-managed authorization as a capability, and clients negotiate it during connection. The IdP only validates policy and mints the grant, meaning it never intercepts raw MCP traffic, and each access token is strictly audience-restricted to its target server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version stability: release deprecation windows and SDK betas
&lt;/h3&gt;

&lt;p&gt;To make the protocol viable for long-term roadmaps, MCP has introduced a formal specification lifecycle. Features now transit through Active → Deprecated → Removed states, with a minimum deprecation window of twelve months. Furthermore, proposed changes to the Standards Track must be validated against a formal conformance suite, and specifications are versioned by calendar date.&lt;/p&gt;

&lt;p&gt;In the 2026–07–28 revision, several legacy features (Roots, Sampling, and Logging) are deprecated. They will be replaced by tool parameters, resource URIs, direct provider APIs, and standard error output or OpenTelemetry streams.&lt;/p&gt;

&lt;p&gt;To allow teams to validate these changes ahead of the final specification release on July 28, the project has published beta SDKs across four languages:&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="c"&gt;# Python - opt-in pre-release&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"mcp[cli]==2.0.0b1"&lt;/span&gt;
&lt;span class="c"&gt;# TypeScript v2 - new split server/client packages&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @modelcontextprotocol/server@beta @modelcontextprotocol/client@beta
&lt;span class="c"&gt;# Go - same module path, pre-release tag&lt;/span&gt;
go get github.com/modelcontextprotocol/go-sdk@v1.7.0-pre.1
&lt;span class="c"&gt;# C#&lt;/span&gt;
dotnet add package ModelContextProtocol &lt;span class="nt"&gt;--prerelease&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The existing v1 SDK lines will receive bug and security patches for at least six months following the final release. Backward compatibility is maintained: v2 servers continue to accept legacy 2025–11–25 handshake requests, allowing clients to upgrade independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this means for teams running agents in production
&lt;/h3&gt;

&lt;p&gt;MCP is now hosted by the &lt;a href="https://aaif.io" rel="noopener noreferrer"&gt;Agentic AI Foundation&lt;/a&gt; under the Linux Foundation. This open governance model ensures neutral stewardship while retaining a focused &lt;a href="https://modelcontextprotocol.io/specification/versioning" rel="noopener noreferrer"&gt;specification enhancement process&lt;/a&gt; led by active maintainers. Implementing a predictable release cadence, formal deprecation timelines, and conformance testing establishes MCP as a reliable infrastructure standard rather than an unstable library.&lt;/p&gt;

&lt;p&gt;With the 2026–07–28 specification locking at the end of July and SDK betas available, you should evaluate the following points in your deployment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify session dependencies.&lt;/strong&gt; If your setup relies on sticky routing or shared session tables, migrating to the stateless core will allow you to transition to standard round-robin load balancing and simplify your infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate your onboarding flow.&lt;/strong&gt; If your servers currently require individual user consent redirects, verify if your IdP and client support the new enterprise token-exchange extension to enable role-based authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan your version migrations.&lt;/strong&gt; If your systems are pinned to the original 2025–11–25 specification, utilize the 12-month deprecation window to map out updates to your tool and resource signatures.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>agents</category>
      <category>datascience</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The Affordable AI Agents</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Thu, 25 Jun 2026 11:23:59 +0000</pubDate>
      <link>https://dev.to/fmind/the-affordable-ai-agents-lp0</link>
      <guid>https://dev.to/fmind/the-affordable-ai-agents-lp0</guid>
      <description>&lt;p&gt;As AI agents transition from isolated developer experiments into production-scale workflows, engineering organizations are waking up to a sobering financial reality: the cost of running AI systems scales linearly, not logarithmically.&lt;/p&gt;

&lt;p&gt;In traditional software engineering, scaling a platform reduces the marginal cost per transaction toward zero. With agentic architectures, however, every loop, file traversal, and API call incurs a direct token cost.&lt;/p&gt;

&lt;p&gt;At one of my enterprise customers, with a distributed engineering team of 5,000 developers, we recently lived through the consequences of this shift. When&lt;a href="https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/" rel="noopener noreferrer"&gt;GitHub Copilot transitioned to strict usage-based billing (UBB)&lt;/a&gt; on June 1, 2026, it triggered a massive 5x cost increase in a single month. Background agents got caught in unoptimized autonomous debug cycles, consuming compute at machine speed and turning a promised productivity gain into an infrastructure budget emergency.&lt;/p&gt;

&lt;p&gt;We haven’t ditched GitHub Copilot yet, but this bill shock forced our hand. We initiated a deep evaluation of alternative options, focusing heavily on self-hosted open-weights models running on our Google Cloud Platform (GCP) infrastructure.&lt;/p&gt;

&lt;p&gt;To establish a path to genuine ROI, we had to apply strict Cartesian FinOps rigor to our AI token consumption. This article is a &lt;strong&gt;RETEX (Return on Experience)&lt;/strong&gt; on evaluating managed SaaS APIs, GCP self-hosted infrastructure, and decentralized local execution to limit the financial bleeding.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ADWXzh2xyPjTQESTD" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ADWXzh2xyPjTQESTD" width="1024" height="683"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Sasun Bughdaryan on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Collapse of VC-Subsidized Subscriptions
&lt;/h3&gt;

&lt;p&gt;Flat-rate subscriptions were venture-backed land grabs. They were never a sustainable long-term option for agentic workloads, and they are now collapsing under the computational weight of autonomous loops.&lt;/p&gt;

&lt;p&gt;The scale of this subsidization was staggering.&lt;a href="https://startupfortune.com/openais-leaked-financials-show-who-is-actually-winning-the-ai-arms-race/" rel="noopener noreferrer"&gt;Leaked financial disclosures&lt;/a&gt; (widely discussed in developer spaces like this&lt;a href="https://arstechnica.com/civis/threads/leaked-financial-docs-show-openai-is-losing-billions-of-dollars-a-year.1513551/" rel="noopener noreferrer"&gt;Ars Technica thread&lt;/a&gt;) show that OpenAI spent &lt;strong&gt;$34 billion against $13 billion in revenue in 2025&lt;/strong&gt;  — yielding an operating loss of &lt;strong&gt;$21 billion&lt;/strong&gt;. Most of this capital flowed directly to infrastructure providers like Microsoft and NVIDIA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why our bill spiked:&lt;/strong&gt; Previously, heavy Copilot usage was governed by a flat allowance of about 300 requests per user. Under the new UBB model, that was replaced by a pooled allowance of “AI Credits” (1 credit = $0.01) based on raw token throughput. A massive 30,000-token codebase ingestion used to count as &lt;em&gt;one request&lt;/em&gt;. Today, that single agentic run drains dollars from the shared credit pool in days.&lt;/p&gt;

&lt;p&gt;Data from the&lt;a href="https://ramp.com/leading-indicators/ai-index-june-2026" rel="noopener noreferrer"&gt;Ramp AI Index (June 2026)&lt;/a&gt; reveals a profound polarization in corporate spend resulting from this shift:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Median Company:&lt;/strong&gt; Spends &lt;strong&gt;$11&lt;/strong&gt; per employee/month (mostly human-in-the-loop chat).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Top 10%:&lt;/strong&gt; Spends &lt;strong&gt;$611&lt;/strong&gt; per employee/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Top 1%:&lt;/strong&gt; Spends a massive &lt;strong&gt;$7,449&lt;/strong&gt; per employee/month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A human developer is restricted by biology. Autonomous agents running parallel iterations are not.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Managed SaaS Baseline
&lt;/h3&gt;

&lt;p&gt;To rigorously evaluate our GCP self-hosting and local alternatives, we first needed to establish a pure API baseline. Our estimated workload for our standard agentic IDE setup is &lt;strong&gt;1.85 million prompt iterations per month&lt;/strong&gt; &lt;em&gt;(5,000 developers × ~17 prompts per active workday)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Our baseline utilized the highly efficient&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Google Gemini 3.5 Flash&lt;/a&gt; API on Vertex AI. Standard pricing is &lt;strong&gt;$1.50 per 1M input tokens&lt;/strong&gt; and &lt;strong&gt;$9.00 per 1M output tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s calculate the economics for a standard codebase query (10,000-token input, 2,000-token output):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Input cost:&lt;/strong&gt;  $0.0150&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output cost:&lt;/strong&gt;  $0.0180&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total cost per query:&lt;/strong&gt;   &lt;strong&gt;$0.0330&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At 1.85 million queries, our baseline SaaS cost is &lt;strong&gt;$61,050 per month&lt;/strong&gt;. This is mathematically sound and reflects a mature IDE doing continuous context injection and proactive suggestions.&lt;/p&gt;

&lt;p&gt;However, running this exact same workload on premium flagship models quickly triggers budget overruns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com/news/claude-opus-4-8" rel="noopener noreferrer"&gt;&lt;strong&gt;Claude 4.8 Opus&lt;/strong&gt;&lt;/a&gt; ($5.00/M in, $25.00/M out): Inflates the bill to &lt;strong&gt;$185,000 / month.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;Claude Fable 5&lt;/strong&gt;&lt;/a&gt; ($10.00/M in, $50.00/M out): Balloons the cost to &lt;strong&gt;$370,000 / month.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At these prices, an unoptimized sub-agent looping indefinitely in the background ceases to be a developer friction and becomes a board-level issue, as highlighted by &lt;a href="https://fortune.com/2026/05/26/uber-coo-ai-spending-tokens-claude-code/" rel="noopener noreferrer"&gt;Fortune reporting on Uber exhausting its entire 2026 AI budget in just four months&lt;/a&gt; on Claude coding tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Challenges of Self-Hosting
&lt;/h3&gt;

&lt;p&gt;Confronted with the risks of runaway API bills, our infrastructure team evaluated self-hosting open-weights models on Google Kubernetes Engine (GKE). SOTA models like Zhipu AI’s &lt;a href="https://z.ai/blog/glm-5.2" rel="noopener noreferrer"&gt;GLM-5.2&lt;/a&gt; are &lt;a href="https://thezvi.wordpress.com/2026/06/22/glm-5-2-is-the-new-best-open-model/" rel="noopener noreferrer"&gt;rapidly closing the gap with proprietary giants&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, a strict FinOps analysis reveals that self-hosting is not a silver bullet: it simply replaces a variable API bill with a massive, fixed infrastructure baseline. Based on a standard &lt;strong&gt;730-hour cloud month&lt;/strong&gt; , here are the real cluster economics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ai.google.dev/gemma/docs/core" rel="noopener noreferrer"&gt;&lt;strong&gt;Gemma 4 26B MoE&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;:&lt;/strong&gt; Served on cost-efficient GCP &lt;a href="https://gcloud-compute.com/g2-standard-48.html" rel="noopener noreferrer"&gt;g2-standard-48&lt;/a&gt; nodes (4x NVIDIA L4, 96GB VRAM) at &lt;strong&gt;$4.00/hr&lt;/strong&gt;. An autoscaling cluster averaging 4 active nodes costs 4 × 730 × $4.00 = &lt;strong&gt;$11,680 per month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/Qwen/Qwen3-Coder-Next-Base" rel="noopener noreferrer"&gt;&lt;strong&gt;Qwen3-Coder-Next&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(80B MoE):&lt;/strong&gt; The 92GB FP8 runtime footprint causes immediate Out-Of-Memory (OOM) failures under concurrency on standard L4 nodes (which max out at 96GB of heavily fragmented VRAM). Because GCP does not offer “single-GPU” rentals for its flagship H100/H200 instances, hosting this requires falling back to an &lt;a href="https://cloud.google.com/compute/docs/gpus" rel="noopener noreferrer"&gt;a2-ultragpu-2g&lt;/a&gt; instance (2x NVIDIA A100 80GB GPUs, 160GB total VRAM) at &lt;strong&gt;$10.14/hr&lt;/strong&gt;. Averaging 3 active nodes costs 3 × 730 × $10.14 = &lt;strong&gt;$22,206 per month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://z.ai/blog/glm-5.2" rel="noopener noreferrer"&gt;&lt;strong&gt;GLM-5.2&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(744B MoE):&lt;/strong&gt; Its massive footprint makes it physically impossible to run on standard 40GB GPU instances. Even aggressively quantized to INT4, the weights alone consume ~372GB of VRAM. Hosting it with a usable 1M-token KV cache demands high-end &lt;a href="https://cloud.google.com/compute/docs/gpus" rel="noopener noreferrer"&gt;a2-ultragpu-8g&lt;/a&gt; instances (8x NVIDIA A100 80GB GPUs, 640GB total VRAM) at &lt;strong&gt;~$40.55/hr&lt;/strong&gt;. Averaging 3 active nodes scales the cluster bill to 3 × 730 × $40.55 = &lt;strong&gt;$88,804 per month&lt;/strong&gt;  — a massive premium &lt;em&gt;over&lt;/em&gt; our managed SaaS baseline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/docs/cuds" rel="noopener noreferrer"&gt;Committed use contracts&lt;/a&gt; can significantly reduce infrastructure bills by locking in lower compute rates. However, this demands high FinOps maturity: organizations must accurately forecast long-term AI usage and strictly commit the company to specific hardware families to avoid wasting budget on unused or obsolete GPUs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hidden TCO:&lt;/strong&gt; Managing a GKE LLM gateway requires at least 1–2 ML Platform Engineers to debug GPU drivers, handle routing, and optimize execution. Factoring in their fully loaded salaries ($20,000–$40,000/month) completely erases the raw compute savings of hosting mid-tier models like Gemma.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Local Execution Fallacy
&lt;/h3&gt;

&lt;p&gt;If centralized GCP self-hosting carries high overhead, what about decentralizing to developer workstations? We tested running&lt;a href="https://developers.googleblog.com/gemma-4-12b-the-developer-guide/" rel="noopener noreferrer"&gt;&lt;strong&gt;Gemma 4 12B&lt;/strong&gt;&lt;/a&gt; and&lt;a href="https://fireworks.ai/blog/qwen-3p7-plus" rel="noopener noreferrer"&gt;&lt;strong&gt;Qwen 3.7&lt;/strong&gt;&lt;/a&gt; locally on Apple Silicon M4 Macs. While this successfully bypasses cloud costs, it introduces severe bottlenecks to developer velocity:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. macOS Memory Allocation Limits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apple Silicon shares unified memory dynamically between the CPU and GPU. By default, the Metal API restricts GPU allocations via the &lt;a href="https://developer.apple.com/documentation/metal/mtldevice/recommendedmaxworkingsetsize" rel="noopener noreferrer"&gt;recommendedMaxWorkingSetSize&lt;/a&gt; property to ~70% of physical RAM to prevent OS starvation. On a 32GB Mac, this leaves a hard VRAM ceiling of ~22GB. Attempting to force-override this limit locks wired memory that cannot page to disk, inevitably leading to&lt;a href="https://github.com/ml-explore/mlx-lm/issues/883" rel="noopener noreferrer"&gt;Apple MLX kernel panics&lt;/a&gt; and system crashes when developers multitask.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Prefill Latency Bottleneck (The Flow Killer)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt ingestion (the prefill phase) is heavily compute-bound. Because a base M4 chip lacks the compute density of a datacenter GPU, ingesting a standard 10,000-token codebase context locally takes &lt;strong&gt;45 to 60 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Compare this directly to our baseline:&lt;/em&gt; Google’s TPU infrastructure processes that exact same 10,000-token prefill via the &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-5/" rel="noopener noreferrer"&gt;Gemini 3.5 Flash API&lt;/a&gt; in &lt;strong&gt;roughly 1 to 2 seconds&lt;/strong&gt;. Waiting a minute for your local agent to “read” your code completely shatters the developer’s flow state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Bandwidth Ceiling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once prefill completes, generation is memory bandwidth-bound. A base M4 chip has 120 GB/s of unified memory bandwidth. Pushing a 12B parameter model (quantized to roughly 8GB) across the bus establishes an absolute physical generation ceiling of &lt;strong&gt;~15 tokens per second&lt;/strong&gt; (120/8). No software framework optimization can bypass physical hardware limits.&lt;/p&gt;

&lt;p&gt;Distributing quantized weights to endpoints and triaging local crashes adds an estimated IT maintenance overhead of &lt;strong&gt;2 hours per month per developer&lt;/strong&gt;. Combined with the lost productivity of 60-second wait times per prompt, the decentralized savings are a total illusion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Harsh Reality&lt;/strong&gt; : With Apple&lt;a href="https://9to5mac.com/2026/06/17/apple-confirms-price-increases-are-coming-to-its-products-due-to-ram-shortage/" rel="noopener noreferrer"&gt;confirming price increases on its laptops&lt;/a&gt; and the&lt;a href="https://www.theverge.com/news/839353/pc-ram-shortage-pricing-spike-news" rel="noopener noreferrer"&gt;global shortage of RAM&lt;/a&gt;, this hardware-dependent approach is simply not scalable. It is financially unfeasible to provision expensive, maxed-out Macs to every single developer across a 5,000-person engineering organization just to support local inference.&lt;/p&gt;

&lt;p&gt;Furthermore, moving AI execution to individual workstations creates a decentralized black box. It completely strips away the centralized telemetry, usage tracking, and auditability required for enterprise security and strict FinOps compliance.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Our Architectural Playbook Moving Forward
&lt;/h3&gt;

&lt;p&gt;Based on our evaluation of GCP infrastructure versus managed APIs and local execution, we stopped treating AI hosting as a binary choice. To navigate the new token economic realities, we propose a staged, hybrid roadmap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Optimize context footprint with managed APIs first:&lt;/strong&gt; For new use cases, we keep capital costs low by leveraging standard managed APIs. This is the easiest and most convenient way to experiment with LLMs and quickly adapt the model to the user context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classify workloads and route queries by task complexity:&lt;/strong&gt; We treat LLMs like consultants. We recommend using ultra-premium flagship models (like Claude 4.8 Opus) exclusively for complex architectural design or security audits. Conversely, standard code completions, minor edits, and debugging queries are strictly routed to fast, cost-efficient mid-tier models (like Gemini 3.5 Flash or Claude 4.6 Sonnet).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage enterprise subscriptions cautiously with growth margins:&lt;/strong&gt; We haven’t migrated off Copilot yet because it still offers predictable seat-based budgeting in the short term. However, we are investing in providers willing to keep subscription-based pricing, knowing we need to have clear and long-term contracts to guarantee these costs and capacity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host selective open-weights models for high-frequency automation:&lt;/strong&gt; Our GCP evaluation proved that self-hosting makes financial sense primarily for mature and predictable use cases. We can provide capacity for tasks like AI coding or day-to-day automation using models like Gemma 4. This caps our infrastructure cost on tasks running 24/7, keeping them completely off the pay-per-use meter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factor in the hidden hardware, latency, and personnel TCO:&lt;/strong&gt; Before migrating any workload, we account for the full operational cost. Decoupling from SaaS APIs to run LLMs on local developer Macs introduces workflow-destroying latency bottlenecks, while GKE hosting requires specialized ML platform engineers. We only shift workloads when the ROI justifies the maintenance overhead.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The era of all-you-can-eat AI and &lt;a href="https://en.wikipedia.org/wiki/Token_maxxing" rel="noopener noreferrer"&gt;token maxxing&lt;/a&gt; is over. As open-weights models close the performance gap with proprietary APIs, designing a hybrid infrastructure is the only path to long-term model independence and predictable costs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How is your engineering team handling the shift to usage-based AI billing? Are you sticking with GitHub Copilot, evaluating GCP self-hosting, or testing local models? Let me know in the comments below or reach out to me directly here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>generativeaitools</category>
      <category>agents</category>
      <category>softwareengineering</category>
      <category>artificialintelligen</category>
    </item>
    <item>
      <title>Agent Evolutions: Stop Guessing the Design — Evolve It</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Mon, 01 Jun 2026 18:59:29 +0000</pubDate>
      <link>https://dev.to/fmind/agent-evolutions-stop-guessing-the-design-evolve-it-4je0</link>
      <guid>https://dev.to/fmind/agent-evolutions-stop-guessing-the-design-evolve-it-4je0</guid>
      <description>&lt;p&gt;Most coding-agent tasks have one right answer hiding behind a workflow. “Add password sign-in.” “Fix the off-by-one in the pagination cursor.” “Refactor this handler to use the new client.” The job is to converge — pick the path, drive it to done, ship the diff. That is the world &lt;a href="https://fmind.medium.com/agent-levers-a-plan-do-check-act-loop-that-makes-coding-agents-finish-what-they-start" rel="noopener noreferrer"&gt;&lt;strong&gt;agent-levers&lt;/strong&gt;&lt;/a&gt; lives in.&lt;/p&gt;

&lt;p&gt;Some tasks aren’t shaped like that. “Which prompt wins?” “Which caching strategy is fastest?” “Which library shape is friendlier to call from a worker?” There is no single correct path. There are five plausible ones, the differences are not obvious from inspection, and the only honest way to pick is to &lt;em&gt;measure&lt;/em&gt;. The shape of the work is &lt;strong&gt;divergent&lt;/strong&gt;  — branch out, evaluate, keep what works.&lt;/p&gt;

&lt;p&gt;I kept reaching for that second shape and finding nothing on the shelf. So I built &lt;a href="https://github.com/fmind/agent-evolutions" rel="noopener noreferrer"&gt;&lt;strong&gt;agent-evolutions&lt;/strong&gt;&lt;/a&gt; — a small set of &lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; that turn a coding agent into a budgeted genetic search over a design space, with verifiable scoring at every step.&lt;/p&gt;

&lt;p&gt;This is the fourth post in a thread on the shared .agents/ ground, after &lt;a href="https://fmind.medium.com/supagents-one-source-to-rule-your-coding-subagents-" rel="noopener noreferrer"&gt;supagents&lt;/a&gt;, &lt;a href="https://fmind.medium.com/agent-docs-answer-locally-before-the-web" rel="noopener noreferrer"&gt;agent-docs&lt;/a&gt;, and &lt;a href="https://fmind.medium.com/agent-levers-a-plan-do-check-act-loop-that-makes-coding-agents-finish-what-they-start" rel="noopener noreferrer"&gt;agent-levers&lt;/a&gt;. Same bet, different question: levers ask &lt;em&gt;“did we build it right?”&lt;/em&gt;, evolutions ask &lt;em&gt;“did we pick the right thing to build?”&lt;/em&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.amazonaws.com%2Fuploads%2Farticles%2Flqyrdkq2xtw59dfb9f2z.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2Flqyrdkq2xtw59dfb9f2z.jpeg" width="800" height="436"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Agent Evolutions: Genetic exploration of solution spaces, with verifiable scoring — &lt;a href="https://github.com/fmind/agent-evolutions" rel="noopener noreferrer"&gt;https://github.com/fmind/agent-evolutions&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The design-by-intuition tax
&lt;/h3&gt;

&lt;p&gt;Three failure modes I keep watching teams pay for — including my own:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The five-minute eyeball test.&lt;/strong&gt; Two prompts on the screen, both look reasonable. One person prefers the terser one; another prefers the structured one. The team picks whichever was authored by the loudest reviewer. Three weeks later a quiet regression appears on a slice of traffic nobody A/B’d against.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taste vs. taste.&lt;/strong&gt; “Which client shape should we expose — fluent builder or plain options bag?” Six people, six opinions, zero numbers. The argument lasts a week. Whatever ships is then defended for years because rolling it back is more expensive than living with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The benchmark that becomes a vote.&lt;/strong&gt; “Which caching strategy is fastest?” Real, mechanical, measurable. Then someone runs &lt;em&gt;one&lt;/em&gt; manual test, on &lt;em&gt;one&lt;/em&gt; workload, and reports a winner. Nobody asks how sensitive the result is, nobody runs the loser to confirm, nobody bothers with a second seed.&lt;/p&gt;

&lt;p&gt;These all share a common shape: a design question with multiple plausible answers and at least one mechanical measure — &lt;em&gt;and we answered it with intuition anyway&lt;/em&gt;. The cost of guessing wrong is rarely visible at decision time. It shows up months later as a refactor.&lt;/p&gt;

&lt;p&gt;What I wanted was a tool that made the right move — &lt;em&gt;generate variants, measure, evolve, pick&lt;/em&gt; — cheaper than the wrong move. That is the gap agent-evolutions is aimed at.&lt;/p&gt;

&lt;h3&gt;
  
  
  Convergent and divergent loops, side by side
&lt;/h3&gt;

&lt;p&gt;The clearest way I can frame the relationship to agent-levers is by the shape of the loop.&lt;/p&gt;

&lt;p&gt;Levers is &lt;strong&gt;convergent&lt;/strong&gt;. One workspace, one diff, one verifier set, plan → do → check → act in a sequential chain. The question being answered is &lt;em&gt;how do we drive this single task to done&lt;/em&gt;. The whole machine is tuned to finish.&lt;/p&gt;

&lt;p&gt;Evolutions is &lt;strong&gt;divergent, then convergent&lt;/strong&gt;. N parallel workspaces (one per variant), N independent results, batched generations that learn from the previous batch, a final pick at the end. The question is &lt;em&gt;which of several plausible designs measures best&lt;/em&gt;. The machine is tuned to explore first, then collapse.&lt;/p&gt;

&lt;p&gt;Both loops live on the same .agents/ ground, both use file-based state, both let any compliant coding agent drive them. They are not competitors — they are complementary tools for different question shapes. Most non-trivial work, in my experience, is mostly levers and occasionally evolutions. The trick is knowing which kind of question you’re holding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Genetic search, not random sampling
&lt;/h3&gt;

&lt;p&gt;The first thing people picture when I say “spawn variants in parallel and pick the best” is brute-force Best-of-N: fan out thirty prompt mutations, score them, keep the top one. That is sampling. It is blind, and it scales badly — doubling the budget barely improves the answer because every sample is drawn from the same flat distribution.&lt;/p&gt;

&lt;p&gt;Agent-evolutions runs a &lt;strong&gt;genetic&lt;/strong&gt; loop instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generation 1&lt;/strong&gt; seeds a small, &lt;em&gt;diverse&lt;/em&gt; set of hypotheses — qualitatively different approaches, not minor variants of one idea.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation 2+&lt;/strong&gt; mutates the top survivors, crosses pairs over, and injects a small share of fresh exploration variants to avoid premature collapse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batches are sized to budget.parallel&lt;/strong&gt; , deliberately, so the loop can &lt;em&gt;learn between batches&lt;/em&gt; instead of fanning out blindly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stopping&lt;/strong&gt; is automatic: budget cap, wall clock, score plateau across N generations, or no survivors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each generation conditions on what worked in the previous one. That is the qualitative difference — and the reason a small directed search routinely beats a much larger random one. The skill’s documented optimize cli startup walkthrough finishes in 24 evaluated variants across 4 generations, with the winner from generation 2 — not generation 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three commands, three phases
&lt;/h3&gt;

&lt;p&gt;The whole surface area is three slash commands, one per phase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt;  — /new-agent-evolution  discusses the brief (objective, gates, rubric, scope, budget) and commits it when you agree.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Run&amp;lt;/strong&amp;gt;  — /run-agent-evolution &amp;lt;id&amp;gt; plans a batch, spawns variants in parallel, ingests each result.json, scores, evolves, and stops on a condition.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Apply&amp;lt;/strong&amp;gt;  — /apply-agent-evolution &amp;lt;id&amp;gt; diffs the winner workspace against the live repo, confirms with you, copies it in, and optionally re-runs gates against the repo.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;Diff winner workspace vs the live repo → confirm → copy in → optionally re-run gates against the repo.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The state machine is the one design choice I find myself most pleased with. There is no step counter, no pause flag, no “current phase” field. Phase is &amp;lt;strong&amp;gt;derived from the presence of fields&amp;lt;/strong&amp;gt; in evolution.yaml:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;empty variants → &amp;lt;strong&amp;gt;ready&amp;lt;/strong&amp;gt; to run&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;has variants, no winner →  &amp;lt;strong&amp;gt;running&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;has winner, no applied → &amp;lt;strong&amp;gt;evaluated&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;has applied →  &amp;lt;strong&amp;gt;done&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;Each skill reads the yaml on entry, infers what phase the evolution is in, and refuses to run outside its own. Capture won’t recreate a brief that already exists. Run won’t re-rank a finished evolution. Apply won’t run without a winner. The skills are stateless; the disk is the source of truth. Crash mid-batch, restart, and the next invocation picks up exactly where the files left off.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-contracts-that-make-the-scoring-honest" href="#the-contracts-that-make-the-scoring-honest" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The contracts that make the scoring honest
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;A genetic loop with sloppy scoring is just an expensive random walk. Agent-evolutions leans hard on three contracts that keep selection grounded.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Gates are binary.&amp;lt;/strong&amp;gt; Each gate is a shell command. Exit 0 means pass, anything else means fail. A variant that fails any gate is &amp;lt;em&amp;gt;excluded from ranking entirely&amp;lt;/em&amp;gt; — no partial credit, no negotiation. Gates are how the framework refuses to compare “fast but broken” against “correct and slow”.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;The rubric is numeric.&amp;lt;/strong&amp;gt; Each rubric axis has a direction (minimize or maximize) and a weight. The composite score is a rank-normalized weighted mean across axes — robust to outliers, well-defined under partial data, and crucially &amp;lt;strong&amp;gt;recomputed on read by the run skill, never persisted&amp;lt;/strong&amp;gt; in the yaml. The yaml stores raw rubric values; the leaderboard view derives from them. You cannot accidentally enshrine a stale score because there is no stored score to enshrine.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Criteria are frozen up front.&amp;lt;/strong&amp;gt; This is the load-bearing rule. Gates and rubric axes are agreed during the Capture phase and then locked. The run skill refuses to add a new rubric axis after results come in. Without that rule, the evaluator silently turns into a rationalization engine — adding the axis on which the variant the agent likes anyway happens to win.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The unstated cousin of these contracts: no silent retries, no narrative scoring. A failing gate stays failed. A missing measurement is missing, not interpolated. The leaderboard is allowed to be ugly.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-filebased-subagent-contract" href="#the-filebased-subagent-contract" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The file-based sub-agent contract
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;Each variant runs as its own sub-agent, in its own workspace (a git worktree by default), starting from HEAD. The contract between the parent and each child is not chat — it is a file.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/my1vunokqhl3xrdf98ma.png"/&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;em&amp;gt;Relationship between Agent Evolutions Concepts&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Every variant sub-agent writes variants/v&amp;lt;n&amp;gt;/result.json, validated against a &amp;lt;a href="https://github.com/fmind/agent-evolutions/blob/main/result.schema.json"&amp;gt;JSON Schema&amp;lt;/a&amp;gt;. The parent reads files, not chat output. Four properties fall out of that decision:&amp;lt;/p&amp;gt;

&amp;lt;ol&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Crash-survivable.&amp;lt;/strong&amp;gt; A child that finishes its work before the parent gets a chance to read its reply still leaves its result on disk. Partial batches don’t disappear.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Audit trail.&amp;lt;/strong&amp;gt; Every variant’s exact result lives in git. You can re-rank a historical evolution from its files alone, weeks later.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;No JSON-in-chat parsing.&amp;lt;/strong&amp;gt; The classic failure mode where a sub-agent’s reply is “JSON-ish” — with a friendly paragraph in front, or three backticks, or a stray comma — never enters the pipeline. The schema validates a file.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Parallelism stays clean.&amp;lt;/strong&amp;gt; Six sub-agents writing to six different files do not pollute one shared transcript. No interleaved thinking, no merge step.&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;

&amp;lt;p&amp;gt;I would not bother spelling this out if I had not lost an afternoon, more than once, to the JSON-in-chat trap on a previous prototype. File-based sub-agent I/O is the kind of detail that looks pedantic on slide one and saves the whole loop by slide four.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="a-walkthrough  optimize-cli-startup" href="#a-walkthrough  optimize-cli-startup" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  A walkthrough — optimize cli startup
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;The shipped example trims a Node.js CLI’s cold-start time on — version. The brief pins one gate set (build green, tests green) and one rubric axis (median of five hyperfine runs, minimize).&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight console"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="gp"&amp;gt;$&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;/new-agent-evolution &amp;lt;span class="s2"&amp;gt;"optimize cli startup"&amp;lt;/span&amp;gt;
&amp;lt;span class="go"&amp;gt;  → discusses objective, gates, rubric, scope, budget
  → on "looks good", commits .agents/evolutions/1-optimize_cli_startup/

&amp;lt;/span&amp;gt;&amp;lt;span class="gp"&amp;gt;$&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;/run-agent-evolution 1
&amp;lt;span class="go"&amp;gt;  → gen 1: seeds 6 diverse hypotheses — lazy-load, build-time inline,
           plugin-registry map, polyfill strip, prebundled arg-parser,
           dotenv short-circuit
&amp;lt;/span&amp;gt;&amp;lt;span class="gp"&amp;gt;  → spawns 6 sub-agents in parallel;&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;each materializes a worktree,
&amp;lt;span class="go"&amp;gt;           implements its variant, runs gates, writes result.json
  → ranks: v2 (build-time inline) → 142.0 ms · v1 (lazy-load) → 184.2 ms
           v4 fails G2 (test regression) → excluded
  → gen 2: mutates v2 → v7 (v2 + tree-shake help chunk),
           mutates v1 → v8, crosses v2×v3, adds 1 explore
  → ...
  → plateau at gen 4 — top score unchanged across 2 generations
&amp;lt;/span&amp;gt;&amp;lt;span class="gp"&amp;gt;  → stops at 24/30 evaluated;&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;winner v7 at 98.6 ms
&amp;lt;span class="go"&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;span class="gp"&amp;gt;$&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;/apply-agent-evolution 1
&amp;lt;span class="go"&amp;gt;  → diffs variants/v7/workspace vs live src/, tsdown.config.ts, package.json
  → "Confirm to apply, or reply abort"
  → "looks good"
&amp;lt;/span&amp;gt;&amp;lt;span class="gp"&amp;gt;  → copies files in;&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;re-runs G1 + G2 against the live repo&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt; both green  
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The moment I find the most instructive is the winner. v7 came from generation 2 — it is &amp;lt;em&amp;gt;v2 plus a tree-shake tweak that only made sense once v2 had won the first round&amp;lt;/em&amp;gt;. Nobody on the team would have written v7 from scratch in generation 1. Evolution found it because the loop conditioned on v2’s win before composing the next batch. That is the entire pitch of genetic search over sampling, in one trace.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="where-this-skill-set-should-not-run" href="#where-this-skill-set-should-not-run" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  Where this skill set should not run
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;Three patterns where I deliberately do not reach for evolutions, and the skill refuses to seed a brief when it spots them:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;The task is a one-line bug fix, rename, or doc edit.&amp;lt;/strong&amp;gt; Just do it. The overhead of a genetic loop is paid in seconds; the task is paid in seconds. The ratio is wrong.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;There is no mechanical measure — not even a proxy.&amp;lt;/strong&amp;gt; “Make this prose more engaging” has no shell exit and no number. Use a normal review.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;The user has already decided the design.&amp;lt;/strong&amp;gt; “Implement X.” is a levers job, not an evolutions job. Don’t manufacture a search space just to use the tool.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;If a brief tries to start without a gate or a rubric axis, the Capture skill pushes back: &amp;lt;em&amp;gt;“we need at least one mechanical check before variants make sense.”&amp;lt;/em&amp;gt; Either we co-author one, or the evolution doesn’t get a folder. That refusal is on purpose — it is the load-bearing reason variants ranking &amp;lt;em&amp;gt;means&amp;lt;/em&amp;gt; something at the end.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-leverage-axis" href="#the-leverage-axis" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The leverage axis
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;Agent-levers makes one hour of human attention move more — clearer briefs, typed verifiers, lessons that compound, the same fulcrum logic &amp;lt;a href="https://fmind.medium.com/agent-levers-a-plan-do-check-act-loop-that-makes-coding-agents-finish-what-they-start"&amp;gt;I wrote about before&amp;lt;/a&amp;gt;. The asymmetry is &amp;lt;em&amp;gt;human effort in, shipped work out&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Agent-evolutions sits on a different axis. The input is not human attention, it is &amp;lt;em&amp;gt;compute&amp;lt;/em&amp;gt;: six or twelve or twenty-four sub-agents running in parallel, each spending tokens on a variant of the same design question. The output is a defensible answer to &amp;lt;em&amp;gt;which design to ship&amp;lt;/em&amp;gt;. The fulcrum is the same shape — small effort on one end multiplies into directed work on the other — but the lever is bolted to a different wall.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Most teams, today, are spending compute the way a 1990s team spent CPU time on a build: cautiously, one job at a time. The price has dropped, the parallelism has arrived, and the workflows have not caught up. Genetic search on coding tasks is one of the places that gap is widest.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The practical nudge I’ll leave you with: next time a &amp;lt;em&amp;gt;which design wins?&amp;lt;/em&amp;gt; thread starts on Slack, count the design points raised against the design points measured. If the ratio is wildly skewed toward opinion — and it usually is — that is the shape of a question agent-evolutions was built to swallow.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-three-install-paths-mirror-the-three-coding-agents" href="#the-three-install-paths-mirror-the-three-coding-agents" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The three install paths mirror the three coding agents:
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="c"&amp;gt;# Claude Code&amp;lt;/span&amp;gt;
/plugin marketplace add fmind/agent-evolutions
/plugin &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;agent-evolutions@agent-evolutions

&amp;lt;span class="c"&amp;gt;# Gemini CLI&amp;lt;/span&amp;gt;
gemini extensions &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;fmind/agent-evolutions

&amp;lt;span class="c"&amp;gt;# Antigravity CLI&amp;lt;/span&amp;gt;
agy plugin &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;https://github.com/fmind/agent-evolutions

&amp;lt;span class="c"&amp;gt;# GitHub Copilot&amp;lt;/span&amp;gt;
copilot plugin marketplace add fmind/agent-evolutions
copilot plugin &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;agent-evolutions@agent-evolutions
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;To run these skills in &amp;lt;a href="https://opencode.ai/"&amp;gt;OpenCode&amp;lt;/a&amp;gt;, place or clone the skill directories under &amp;lt;code&amp;gt;.agents/skills/&amp;lt;/code&amp;gt; (for project scope) or &amp;lt;code&amp;gt;~/.agents/skills/&amp;lt;/code&amp;gt; (for global scope).&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Then, inside a project:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;/new-agent-evolution &amp;lt;title&amp;gt; &amp;lt;span class="c"&amp;gt;# capture the brief (Session 1)&amp;lt;/span&amp;gt;
/run-agent-evolution &amp;lt;&amp;lt;span class="nb"&amp;gt;id&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="c"&amp;gt;# drive the genetic loop (Session 2)&amp;lt;/span&amp;gt;
/apply-agent-evolution &amp;lt;&amp;lt;span class="nb"&amp;gt;id&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="c"&amp;gt;# land the winner (Session 3)&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The repository is at &amp;lt;a href="https://github.com/fmind/agent-evolutions"&amp;gt;github.com/fmind/agent-evolutions&amp;lt;/a&amp;gt;. The &amp;lt;a href="https://github.com/fmind/agent-evolutions/tree/main/examples/evolutions"&amp;gt;examples/evolutions/&amp;lt;/a&amp;gt; directory ships the full optimize cli startup walkthrough — brief, variants, scored leaderboard, applied diff — so you can read what the artifacts look like before running anything yourself.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Pick a real question. Give it gates and a rubric. Let the loop run while you make coffee. The answer it comes back with will not be the one you would have written on a whiteboard — and that, more often than not, is the point.&amp;lt;/p&amp;gt;

&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>agents</category>
      <category>artificialintelligen</category>
    </item>
    <item>
      <title>Agent Levers: A Plan-Do-Check-Act Loop That Makes Coding Agents Finish What They Start</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Mon, 25 May 2026 05:19:47 +0000</pubDate>
      <link>https://dev.to/fmind/agent-levers-a-plan-do-check-act-loop-that-makes-coding-agents-finish-what-they-start-2ca3</link>
      <guid>https://dev.to/fmind/agent-levers-a-plan-do-check-act-loop-that-makes-coding-agents-finish-what-they-start-2ca3</guid>
      <description>&lt;p&gt;A coding agent is only as useful as the spec you give it. That sentence sounds like a truism until you watch it play out for an afternoon.&lt;/p&gt;

&lt;p&gt;Type too little — “add password sign-in” — and the agent improvises. It picks a JWT library you don’t use, skips rate-limiting, ships a flow that works on the happy path and fails the moment you blow on it. Type too much — every constraint, every test name, every file path — and you’ve done the agent’s homework. You are the bottleneck, not the multiplier.&lt;/p&gt;

&lt;p&gt;I have been trying to find the shape of the work &lt;em&gt;between&lt;/em&gt; those two extremes for months. I built &lt;a href="https://github.com/fmind/agent-levers" rel="noopener noreferrer"&gt;&lt;strong&gt;agent-levers&lt;/strong&gt;&lt;/a&gt; — a small set of &lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; that give the agent a structured &lt;strong&gt;plan → do → check → act&lt;/strong&gt; loop on disk — to do the structuring work I kept doing by hand.&lt;/p&gt;

&lt;p&gt;This is the third post in a thread about the shared .agents/ ground, after &lt;a href="https://fmind.medium.com/supagents-one-source-to-rule-your-coding-subagents-" rel="noopener noreferrer"&gt;supagents&lt;/a&gt; (one subagent source, many targets) and &lt;a href="https://fmind.medium.com/agent-docs-answer-locally-before-the-web" rel="noopener noreferrer"&gt;agent-docs&lt;/a&gt; (a curated, local doc reference). Same bet, different layer: this one is about the &lt;strong&gt;workflow&lt;/strong&gt; an agent runs &lt;em&gt;inside&lt;/em&gt; a non-trivial task.&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.amazonaws.com%2Fuploads%2Farticles%2F81tdz1wjccpysdn7bosi.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2F81tdz1wjccpysdn7bosi.jpeg" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Agent Lever: Multiply the agent’s force, divide the human’s effort — &lt;a href="https://github.com/fmind/agent-levers" rel="noopener noreferrer"&gt;https://github.com/fmind/agent-levers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The two failure modes of unguided agents
&lt;/h3&gt;

&lt;p&gt;After enough sessions, I started noticing the same two failure patterns, no matter which coding agent I drove.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent claims success it didn’t verify.&lt;/strong&gt; It says “I implemented the rate limiter,” shows a diff, and moves on. You ask “did the test pass?” and discover it never ran, or it ran in an ad-hoc shell, or — the meanest version — it passed in the agent’s session and fails the moment you re-run it from a clean terminal. The status report isn’t lying. It’s just not grounded in a verifier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent runs away.&lt;/strong&gt; The first test fails. The second attempt fails. The third attempt fails. Forty minutes later, the diff is twice as large as the original task, and nothing is green. There is no internal “I should stop and ask” trigger because the agent is doing what it was told: keep trying until the test passes.&lt;/p&gt;

&lt;p&gt;Both failure modes have the same root cause: the loop is &lt;em&gt;implicit&lt;/em&gt;. The agent makes up the loop on the fly. Each session improvises a new plan, a new sense of done, a new sense of when to give up.&lt;/p&gt;

&lt;p&gt;The fix I kept reaching for, before I built this, was structure I imposed by hand: a numbered checklist in the prompt, an explicit “run this command after each change,” a polite “stop and ask if you’ve failed three times in a row.” It worked. It also lasted exactly one session, because the next task started from a blank prompt.&lt;/p&gt;

&lt;p&gt;Agent Levers is that structure, externalized. Once.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lever metaphor
&lt;/h3&gt;

&lt;p&gt;The name is the bet. A lever multiplies force on one end while reducing effort on the other. The human pushes on the short side — a one-line brief, plus answers to a handful of clarifying questions — and the agent lifts the long side: investigation, planning, execution, verification, learning.&lt;/p&gt;

&lt;p&gt;The shape of the work is the &lt;a href="https://en.wikipedia.org/wiki/PDCA" rel="noopener noreferrer"&gt;Deming cycle&lt;/a&gt;, borrowed from process engineering and applied to a different kind of factory: &lt;strong&gt;plan → do → check → act&lt;/strong&gt;. Every non-trivial coding task already follows that shape; it just usually lives in the agent’s head, where you can’t audit it. The point of the framework is to push the loop onto disk, where each step is an artifact that can be reviewed, paused, resumed, and continued by a different session.&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.amazonaws.com%2Fuploads%2Farticles%2Fk71sijpq7rc9ozr9n097.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.amazonaws.com%2Fuploads%2Farticles%2Fk71sijpq7rc9ozr9n097.png" width="800" height="234"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Relationship between Coding Agents and Agent Levers&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Four commands, one folder
&lt;/h3&gt;

&lt;p&gt;The whole surface area is four slash commands, three of them user-facing and one of them an internal dispatcher you mostly forget exists.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/lever-init — bootstraps the framework on a fresh repo.&lt;/li&gt;
&lt;li&gt;/lever-new  — captures intent. The first turn is &amp;lt;em&amp;gt;chat-only&amp;lt;/em&amp;gt; — clarifying questions, proposed enhancements, a draft brief inline. No files land until you agree.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;/lever &amp;lt;id&amp;gt; — runs the chain. Plan → do → check → act, autonomously until a pause or a terminal state.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;/lever-status [&amp;lt;id&amp;gt;] — read-only inspector; lists levers, shows one in detail, or cancels one.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;Everything else lives in two files, per lever, on disk: a lever.yaml that holds the machine state, and a LEVER.md that opens with a TL;DR and grows narrative sections as each step runs. Half a day of agent work, audited in twenty lines.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-twosession-split" href="#the-twosession-split" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The two-session split
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;The thing I keep coming back to is the deliberate split between /lever-new and /lever.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;/lever-new is high-context: you and the agent in chat, narrowing down what you actually want. The agent reads project conventions, asks clarifying questions, proposes enhancements you didn’t ask for but probably want (“you specified Google OAuth — want GitHub too?”), drafts the brief inline. No files land until you say “looks good.”&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;/lever is mechanical: a fresh session, reading the state, executing the matching step, advancing the pointer. The dispatcher loads only the step it needs — never all four at once. The agent’s context stays clean across the chain.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The two-session split has a property I value enough to call out: &amp;lt;strong&amp;gt;brief-time is the only place the human is in the loop&amp;lt;/strong&amp;gt;. Once you run /lever 1, the chain runs to completion (or to a structural pause) without re-asking what you wanted. If the brief was crisp, you don’t see the chain again until there is a diff to review.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;I cannot overstate how much I prefer this to the “agent asks twenty questions while implementing” rhythm. The cost of a sharp brief is paid once, up front, in the cheapest part of the process. Everything after compounds on that investment.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-four-steps-briefly" href="#the-four-steps-briefly" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The four steps, briefly
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Plan&amp;lt;/strong&amp;gt; reads the brief, investigates the codebase and external docs itself — grep, reading tests, pinning dependency versions, fetching authoritative docs — and writes a small set of &amp;lt;em&amp;gt;acceptance criteria&amp;lt;/em&amp;gt;, each paired with a typed verifier (a shell command, a screenshot to confirm, or a manual rubric). It also sets a budget — iterations, minutes, failed-streak — so the next step has an explicit leash.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The hard rule on verifiers is: &amp;lt;strong&amp;gt;test the behavior, not the agent’s past actions&amp;lt;/strong&amp;gt;. A criterion that says “function loginHandler exists in src/routes/auth.ts” is bookkeeping — the agent can satisfy it by writing the function and then grepping its own diff. A criterion that says POST /auth/login returns a JWT on valid credentials is verification — it passes when the handler &amp;lt;em&amp;gt;works&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Do&amp;lt;/strong&amp;gt; drives the criteria one at a time. It picks the first failing one, makes the smallest change that should flip it (TDD-style by default for shell verifiers), runs the verifier, and logs the result. Out-of-scope ideas get parked, not silently bundled into the diff. When the budget runs out, the loop stops with state on disk — raise the cap, narrow scope, or hand off; prior passes stay green.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Check&amp;lt;/strong&amp;gt; is the step that earns the framework its keep. It re-runs every verifier from a &amp;lt;em&amp;gt;fresh shell&amp;lt;/em&amp;gt; — not the agent’s session — to catch criteria that secretly relied on cached state. Then it does something I have not seen anywhere else: a &amp;lt;strong&amp;gt;chain audit&amp;lt;/strong&amp;gt;. It walks the trail from brief to plan to events to diff, asking at each handoff whether the next step honored the previous one. The silent-killer audit is the last hop — does the diff actually deliver what the brief asked for, or did the agent build something adjacent? Tests can pass while intent quietly drifts; the chain audit is what catches that.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Act&amp;lt;/strong&amp;gt; runs only if check surfaced &amp;lt;em&amp;gt;hints&amp;lt;/em&amp;gt; — moments where a decision deserved more guidance, or where a recurring pattern started to show. It picks the right surface for each: a project rule lands in AGENTS.md, a skill flaw lands in the skill, work that isn’t a rule becomes a follow-up /lever-new. The edits arrive as proposals in the working tree, reviewed in the same PR as the implementation. &amp;lt;strong&amp;gt;The next lever inherits the rule, not the mistake.&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;This last property is the one I find most underappreciated: the framework has a built-in mechanism for the agent’s workflow to improve. A gotcha that surfaces three times in three separate levers earns its way into AGENTS.md by being staged three times. You don’t have to remember to tell the agent about it next session.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="a-walkthrough-on-a-real-task" href="#a-walkthrough-on-a-real-task" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  A walkthrough on a real task
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;Two human inputs, two sessions, one finished feature.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight console"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="gp"&amp;gt;$&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;/lever-new add password sign-in
&amp;lt;span class="go"&amp;gt;  → first turn: chat-only — clarifying questions, proposed enhancements, draft brief
  → "rate-limit policy for /auth/login? OAuth uses 5/min/IP — match it?"
  → "looks good"
  → captures the brief on disk
  → "Brief captured. In a new session, run /lever 1 to start the chain."

&amp;lt;/span&amp;gt;&amp;lt;span class="gp"&amp;gt;#&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;Fresh session, hours or days later.
&amp;lt;span class="gp"&amp;gt;$&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;/lever 1
&amp;lt;span class="go"&amp;gt;  → plan: investigates the auth + middleware code, writes 4 criteria with shell verifiers
  → do: C1 pass · C2 pass · C3 fail (limiter not wired) · C3 pass · C4 pass
  → check: rerun from fresh shell — all green
           chain audit: Brief→Plan · Plan→Do · Do→Result · Result→Intent — all pass
           2 hints surfaced
  → act: hint 1 → AGENTS.md +5/-0 (explicit "attach middleware" sub-step in TDD)
           hint 2 → recommend /lever-new enforce_route_middleware_lint
  → "Ran: plan → do → check → act. 4/4 passed. 2 hints landed. Done — diff is staged."
&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The interesting moment is the limiter miss at C3 — the kind of off-by-one that on a normal “agent, implement this” run becomes a Slack thread two days later, when QA notices the rate limit doesn’t fire. Here, it surfaces as a single fail row, recovered in the next iteration, lifted into a hint by check, and codified as a rule by act.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;That is the whole pitch in one trace: the loop catches its own mistakes before the human sees them, and the lessons compound for next time.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="install-and-try-it" href="#install-and-try-it" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  Install and try it
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;The three install paths mirror the three coding agents:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="c"&amp;gt;# Claude Code&amp;lt;/span&amp;gt;
/plugin marketplace add fmind/agent-levers
/plugin &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;agent-levers@agent-levers

&amp;lt;span class="c"&amp;gt;# Gemini CLI&amp;lt;/span&amp;gt;
gemini extensions &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;fmind/agent-levers

&amp;lt;span class="c"&amp;gt;# GitHub Copilot (CLI)&amp;lt;/span&amp;gt;
copilot plugin marketplace add fmind/agent-levers
copilot plugin &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;agent-levers@agent-levers
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Then, inside a project:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;/lever-init &amp;lt;span class="c"&amp;gt;# bootstrap the framework&amp;lt;/span&amp;gt;
/lever-new &amp;lt;title&amp;gt; &amp;lt;span class="c"&amp;gt;# capture a new task (Session 1)&amp;lt;/span&amp;gt;
/lever &amp;lt;&amp;lt;span class="nb"&amp;gt;id&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="c"&amp;gt;# run the chain (Session 2)&amp;lt;/span&amp;gt;
/lever-status &amp;lt;span class="o"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;&amp;lt;span class="nb"&amp;gt;id&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class="c"&amp;gt;# inspect or cancel&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The repository is at &amp;lt;a href="https://github.com/fmind/agent-levers"&amp;gt;github.com/fmind/agent-levers&amp;lt;/a&amp;gt;. The &amp;lt;a href="https://github.com/fmind/agent-levers/tree/main/examples/levers"&amp;gt;examples/levers/&amp;lt;/a&amp;gt; directory ships two worked walkthroughs — a happy path and a scenario where check routes back to do — so you can see what the artifacts look like before you run anything.&amp;lt;/p&amp;gt;
&amp;lt;h3&amp;gt;
  &amp;lt;a name="the-lever-effect" href="#the-lever-effect" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  The lever effect
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;A real lever’s mechanical advantage is a ratio: force out per unit of effort in. For a coding agent, the equivalent is &amp;lt;strong&amp;gt;verified, intent-aligned work shipped per minute of human attention spent&amp;lt;/strong&amp;gt;. Clear briefs, typed verifiers, bounded loops, on-disk state, lessons that compound — each one bends that ratio in the same direction.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;We are not trying to build an agent that needs us less. We are building the fulcrum that lets the same hour of human attention move more. Give &amp;lt;a href="https://github.com/fmind/agent-levers"&amp;gt;&amp;lt;strong&amp;gt;agent-levers&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt; a try — the lever is real when you can feel the asymmetry.&amp;lt;/p&amp;gt;

&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>softwareengineering</category>
      <category>coding</category>
      <category>productivity</category>
      <category>artificialintelligen</category>
    </item>
    <item>
      <title>Agent Docs: Answer Locally Before the Web — A Shared Reference for Every Coding Agent</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Thu, 14 May 2026 06:41:15 +0000</pubDate>
      <link>https://dev.to/fmind/agent-docs-answer-locally-before-the-web-a-shared-reference-for-every-coding-agent-1f8o</link>
      <guid>https://dev.to/fmind/agent-docs-answer-locally-before-the-web-a-shared-reference-for-every-coding-agent-1f8o</guid>
      <description>&lt;p&gt;Pair-program with a coding agent for an afternoon and you start noticing a quiet, recurring tax. Every time the agent reaches for a flag, a config field, or a CLI subcommand, it fires off a web search. Then another. Then a third when the second one returned a 2023-era blog post for a tool you upgraded last week.&lt;/p&gt;

&lt;p&gt;Each round-trip is a few seconds, a few tokens, and — worse — a chance for the agent to pick a plausible-looking answer from the wrong version of the docs. Multiply that by every session, every contributor, every agent on the team, and the tax is no longer quiet.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/fmind/agent-docs" rel="noopener noreferrer"&gt;&lt;strong&gt;agent-docs&lt;/strong&gt;&lt;/a&gt; to make my agents answer locally before they answer remotely. It is a small set of file-based &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; that seed, read, and refresh a curated .agents/docs/ reference for the tools your project actually uses. One install, three commands, three coding agents (&lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;Gemini CLI&lt;/a&gt;, &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;) — the same answer for the same question, every run.&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.amazonaws.com%2Fuploads%2Farticles%2F0836fe2inmro53w1qt20.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2F0836fe2inmro53w1qt20.jpeg" width="800" height="436"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Agent Docs: Project Docs that Answer Locally — &lt;a href="https://github.com/fmind/agent-docs" rel="noopener noreferrer"&gt;https://github.com/fmind/agent-docs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the follow-up to my &lt;a href="https://fmind.medium.com/supagents-one-source-to-rule-your-coding-subagents-" rel="noopener noreferrer"&gt;previous post on supagents&lt;/a&gt; — same bet on the shared .agents/ ground, applied to a different layer of the stack.&lt;/p&gt;
&lt;h3&gt;
  
  
  The hallucination tax has a quieter cousin
&lt;/h3&gt;

&lt;p&gt;When people talk about LLM failure modes, they usually mean hallucination — confident statements that turn out to be invented. That’s real. But there’s a quieter failure mode I see far more often in practice: &lt;strong&gt;lossy retrieval&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The agent doesn’t make things up. It does its honest best and lands on the wrong page. A search for “Gemini CLI hooks” returns a blog post that pre-dates the feature. A search for “Cloud Run revisions” returns the 2022 docs, before the rewrite. The agent reads what’s in front of it, summarizes correctly from the source it found, and produces an answer that is technically faithful to a stale or low-quality input.&lt;/p&gt;

&lt;p&gt;You don’t catch lossy retrieval by reading the agent’s output. You catch it three turns later, when the implementation doesn’t compile against the current SDK and you trace it back to a flag that was renamed in v0.4.&lt;/p&gt;

&lt;p&gt;The fix that occurred to me, after the third time the same agent web-searched the same gemini settings.json page, was almost embarrassingly simple: &lt;strong&gt;stop searching for what we already know&lt;/strong&gt;. Pin the URLs once. Make every agent on the project read from the same shortlist before it touches the web.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Code Wiki nudge
&lt;/h3&gt;

&lt;p&gt;I won’t pretend I came up with the wiki framing in a vacuum. &lt;a href="https://codewiki.google/" rel="noopener noreferrer"&gt;Code Wiki&lt;/a&gt; — a recent project out of Google Labs — was the nudge. The pitch resonated immediately: maintain a curated, version-aware knowledge base that a coding agent can query first, instead of asking it to re-discover the same facts every session.&lt;/p&gt;

&lt;p&gt;What I wanted, though, was different in three specific ways. I wanted it &lt;strong&gt;local&lt;/strong&gt;  — committed to the repo, diffable in a PR, not behind a service. I wanted it &lt;strong&gt;scoped to the project&lt;/strong&gt;  — only the tools and services this codebase actually depends on, nothing else. And I wanted it to work across all coding agents I use daily, not just one.&lt;/p&gt;

&lt;p&gt;So agent-docs is my take: a tiny on-disk reference set, owned by the project, read by any agent that respects the &lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; convention.&lt;/p&gt;
&lt;h3&gt;
  
  
  What lives in .agents/docs/
&lt;/h3&gt;

&lt;p&gt;After you run the gather skill, your project carries a small new directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents/docs/
├── INDEX.md
├── gemini-cli/
│ ├── DOC.md
│ └── HOOKS.md
└── cloud-run/
    └── DOC.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;INDEX.md is a one-line-per-topic dispatch table. Each DOC.md is the entry point for a topic, and large subsystems can split into sibling files (HOOKS.md, EXTENSIONS.md) with their own refresh clocks.&lt;/p&gt;

&lt;p&gt;The crucial design choice is what each DOC.md is — and is not. It is a &lt;strong&gt;navigation map&lt;/strong&gt; , not a copy of the docs. Concretely, every DOC.md carries:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A one-paragraph summary of the topic and where it fits.&lt;/li&gt;
&lt;li&gt;A terse list of key concepts (settings file, slash commands, hooks, MCP servers).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;documentation map&lt;/strong&gt;  — the upstream sidebar, captured as one-line link entries grouped by section. Each entry is &lt;a href="https://dev.tourl"&gt;Page title&lt;/a&gt; — short hook on what’s there.&lt;/li&gt;
&lt;li&gt;An optional Patterns section with paste-ready snippets, capped at five per topic, each tied to an inline _Source: …_ link.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pattern I keep coming back to is: &lt;em&gt;land the agent on the right upstream URL in one hop, then fetch upstream if it needs depth&lt;/em&gt;. Not every fact gets captured locally — only the navigation, plus a handful of high-frequency snippets when the team decides they’re worth it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three skills, one small loop
&lt;/h3&gt;

&lt;p&gt;The whole thing is three skills. They are deliberately small and they compose into a loop you can reach for without thinking.&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.amazonaws.com%2Fuploads%2Farticles%2F348gq4nor2pmktkfs9cs.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.amazonaws.com%2Fuploads%2Farticles%2F348gq4nor2pmktkfs9cs.png" width="800" height="311"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Relationships between Coding Agents, Skills, and Local/Remote Sources&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  /gather-agent-docs — seed the reference
&lt;/h3&gt;

&lt;p&gt;/gather-agent-docs inspects your project’s manifests (package.json, pyproject.toml, go.mod, cloudbuild.yaml, apphosting.yaml, mise.toml) and picks three to eight real topics. It does not guess at what the project “might” use; it picks what the project &lt;em&gt;declares&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For each topic, it fetches one upstream nav source — the docs sidebar, the README’s docs section, or the sitemap as a fallback — and writes a DOC.md with the navigation map mirroring how upstream organizes itself. INDEX.md gets one dated line per topic.&lt;/p&gt;

&lt;p&gt;The default capture tier is intentionally light: title + URL + one-line hook for every page in the upstream nav. That’s it. Paste-ready snippets are opt-in (/gather-agent-docs deepen gemini-cli), capped at five per topic, and only added when the team actually reaches for them often.&lt;/p&gt;
&lt;h3&gt;
  
  
  /use-agent-docs — read before searching
&lt;/h3&gt;

&lt;p&gt;This is the skill that earns its keep on every run. Before the agent reaches for the web on a topic that’s part of the project, it reads .agents/docs/INDEX.md, opens the matching DOC.md, scans the documentation map, and fetches the right upstream URL directly.&lt;/p&gt;

&lt;p&gt;If the index is missing, it’s a no-op — the agent falls through to normal research. If a captured snippet covers the question, the agent uses it (each one carries its upstream source link, so it can verify). If the answer needs flag-level depth, it goes one hop upstream to a URL it already knows is the canonical one.&lt;/p&gt;

&lt;p&gt;Crucially, this is the skill I do not have to remember to invoke. It’s wired as a trigger: “before web-searching for a project topic, check .agents/docs/”. Once installed, the agent reaches for it on its own.&lt;/p&gt;
&lt;h3&gt;
  
  
  /refresh-agent-docs — keep it honest
&lt;/h3&gt;

&lt;p&gt;A curated doc set that is allowed to rot is worse than no doc set, because it lies with confidence. /refresh-agent-docs is the gardener.&lt;/p&gt;

&lt;p&gt;Every DOC.md opens with YAML frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;last_verified&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-05-08&lt;/span&gt;
&lt;span class="na"&gt;upstream_commit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;9f3c2b1&lt;/span&gt;
&lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;docs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://google-gemini.github.io/gemini-cli/&lt;/span&gt;
  &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/google-gemini/gemini-cli&lt;/span&gt;
  &lt;span class="na"&gt;changelog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/google-gemini/gemini-cli/releases&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The refresh skill reads that metadata and tries cheap paths first. If upstream_commit matches upstream HEAD, the page is verified by definition — bump the date, move on. If the changelog has no entries newer than last_verified, same outcome. Only when those short-circuits miss does it fall through to a link-rot scan, then a full re-fetch.&lt;/p&gt;

&lt;p&gt;The richer the frontmatter, the more refreshes complete in a single HTTP call. When a page can’t be re-verified this session, the skill stamps a visible &amp;gt; ⚠ Stale banner at the top so future agents see the warning before they trust the contents.&lt;/p&gt;

&lt;p&gt;This is what I mean by &lt;strong&gt;honest staleness&lt;/strong&gt;. The doc set is allowed to age — that’s fine — but the age is always declared, never hidden. The [YYYY-MM-DD] next to each topic in INDEX.md is the &lt;em&gt;oldest&lt;/em&gt; verification date across the topic’s files, so the index shows the staleness floor at a glance.&lt;/p&gt;

&lt;h3&gt;
  
  
  A walkthrough on a real project
&lt;/h3&gt;

&lt;p&gt;Here is what a typical session looks like, lightly compressed from a real run on a Cloud Run + Gemini CLI project:&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;$ &lt;/span&gt;/gather-agent-docs
  → inspects manifests, picks: gemini-cli, cloud-run, firebase-app-hosting
  → fetches one upstream nav per topic
  → writes .agents/docs/INDEX.md and 3 DOC.md files
  → &lt;span class="s2"&gt;"Seeded 3 topics under .agents/docs/. Review the diff before committing."&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;/gather-agent-docs deepen gemini-cli
  → adds up to 5 Patterns snippets to gemini-cli/DOC.md, each with _Source: …_
  → bumps last_verified

&lt;span class="c"&gt;# Later, mid-session, the agent is asked to wire up a Gemini CLI hook…&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="s2"&gt;"Can you add a pre-tool hook that blocks rm -rf?"&lt;/span&gt;
  → /use-agent-docs fires implicitly
  → reads INDEX.md, opens gemini-cli/DOC.md, scans the documentation map
  → finds gemini-cli/HOOKS.md, opens it, picks the snippet &lt;span class="k"&gt;for &lt;/span&gt;pre-tool hooks
  → writes the hook against the current schema, not a 2024 blog post

&lt;span class="c"&gt;# A month later…&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;/refresh-agent-docs gemini-cli
  → smart path: upstream_commit moved&lt;span class="p"&gt;;&lt;/span&gt; scans changelog since last_verified
  → finds one entry touching hooks&lt;span class="p"&gt;;&lt;/span&gt; re-fetches HOOKS.md&lt;span class="s1"&gt;'s snippet sources
  → repairs two renamed links in DOC.md'&lt;/span&gt;s documentation map
  → &lt;span class="s2"&gt;"gemini-cli: links repaired (DOC.md), snippet edits (HOOKS.md)."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two things I notice consistently after running this for a few weeks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Round-trips collapse.&lt;/strong&gt; The “search → skim → search again” loop turns into a single fetch. The agent’s output shows up faster because there’s less network in front of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answers stop drifting between sessions.&lt;/strong&gt; Three contributors asking the agent “where is X configured?” get the same upstream page, because the agent reads the same map.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Local-first, on purpose
&lt;/h3&gt;

&lt;p&gt;A few people asked me, when I described this, why I didn’t just point the agent at the upstream docs site directly and let it search. Two reasons.&lt;/p&gt;

&lt;p&gt;First, &lt;em&gt;scope&lt;/em&gt;. The upstream docs for any non-trivial tool are an ocean. The right answer for a given project is a narrow shoreline — the flags this team uses, the patterns this codebase follows, the canonical URL we trust. Curating the map shrinks the search space from “every page on the site” to “the dozen pages we actually touch”.&lt;/p&gt;

&lt;p&gt;Second, &lt;em&gt;commit-ability&lt;/em&gt;. .agents/docs/ lives in git. It travels with the code. It diffs in PRs. When a contributor updates the Gemini CLI version, the PR can include the refreshed map alongside the version bump, reviewed in the same place. A hosted service can’t be diffed in your PR.&lt;/p&gt;

&lt;p&gt;There is a real cost: someone on the team has to run /refresh-agent-docs periodically, and someone has to decide when a snippet is worth capturing. That cost is the point. It is the same cost we pay to maintain a README.md that doesn’t lie — and we pay it because the alternative is worse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where this sits in the .agents/ stack
&lt;/h3&gt;

&lt;p&gt;If you read my &lt;a href="https://fmind.medium.com/supagents-one-source-to-rule-your-coding-subagents-" rel="noopener noreferrer"&gt;supagents post&lt;/a&gt;, the framing here will feel familiar. I keep finding the same pattern: a thing that should be one source, fragmented across N coding-agent harnesses, that we can unify in the shared .agents/ ground.&lt;/p&gt;

&lt;p&gt;Supagents handles &lt;strong&gt;subagent personas&lt;/strong&gt;  — one markdown source compiled to .claude/agents/, .gemini/agents/, .github/agents/. Agent Docs handles &lt;strong&gt;project knowledge&lt;/strong&gt;  — one .agents/docs/ folder, read by any agent that follows the &lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md convention&lt;/a&gt; (which now includes Claude Code, Gemini CLI, and GitHub Copilot).&lt;/p&gt;

&lt;p&gt;These are two slices of the same bet: the future of coding agents is not a winner-takes-all framework. It’s a shared file-system layout, with small composable conventions, that every tool reads in its own way. The friction goes away when we stop reinventing storage formats and start respecting a common root.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install and try it
&lt;/h3&gt;

&lt;p&gt;The three install paths mirror the three coding agents:&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="c"&gt;# Claude Code&lt;/span&gt;
/plugin marketplace add fmind/agent-docs
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;agent-docs@agent-docs

&lt;span class="c"&gt;# Gemini CLI&lt;/span&gt;
gemini extensions &lt;span class="nb"&gt;install &lt;/span&gt;fmind/agent-docs

&lt;span class="c"&gt;# GitHub Copilot (CLI)&lt;/span&gt;
copilot plugin marketplace add fmind/agent-docs
copilot plugin &lt;span class="nb"&gt;install &lt;/span&gt;agent-docs@agent-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository is at &lt;a href="https://github.com/fmind/agent-docs" rel="noopener noreferrer"&gt;github.com/fmind/agent-docs&lt;/a&gt;. The &lt;a href="https://github.com/fmind/agent-docs/tree/main/examples" rel="noopener noreferrer"&gt;examples/&lt;/a&gt; directory ships a worked sample of what gather produces — two topics, one with a subtopic split — so you can see the output shape before you run it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small tools, on purpose
&lt;/h3&gt;

&lt;p&gt;I keep coming back to the &lt;a href="https://fmind.medium.com/ai-agents-as-an-operating-system-rediscovering-the-linux-philosophy-f0e76f29ebdb" rel="noopener noreferrer"&gt;Linux philosophy&lt;/a&gt; when I build things in this space: small tools, one job, composable. Agent Docs is three skills (gather, use, refresh) that touch one folder (.agents/docs/) and respect one shared root (.agents/). That’s the whole surface area.&lt;/p&gt;

&lt;p&gt;The bet is that this is enough. A curated map is cheaper than a clever retrieval system, the same way a README.md is cheaper than an auto-generated wiki. The reason README.md survived every documentation-platform fad for two decades is that it’s a flat file that travels with the code and reads correctly without a runtime. .agents/docs/ is the same shape, aimed at the agent instead of the human.&lt;/p&gt;

&lt;p&gt;If you are running coding agents on a real project — and tired of watching them re-search the same SDK every afternoon — give it a try. If it saves you the third web round-trip on a Friday, it has earned its keep.&lt;/p&gt;

</description>
      <category>coding</category>
      <category>machinelearning</category>
      <category>agents</category>
      <category>programming</category>
    </item>
    <item>
      <title>Supagents: One Source to Rule Your Coding Subagents</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Sun, 10 May 2026 19:30:48 +0000</pubDate>
      <link>https://dev.to/fmind/supagents-one-source-to-rule-your-coding-subagents-4bof</link>
      <guid>https://dev.to/fmind/supagents-one-source-to-rule-your-coding-subagents-4bof</guid>
      <description>&lt;p&gt;The AI providers are in a horse race. Every quarter, a new model lands, a new harness ships, and the gap between “the best tool for &lt;em&gt;this&lt;/em&gt; task” and “the best tool overall” keeps moving. As developers, we have already stopped picking sides — we pick the right tool for the job, and we switch between them constantly.&lt;/p&gt;

&lt;p&gt;I noticed this pattern hardening in my own workflow. I drive &lt;a href="https://docs.claude.com/en/docs/claude-code/overview" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; for deep refactors, &lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;Gemini CLI&lt;/a&gt; for long-context exploration, and &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt; for the IDE flow. Each one has carved out a niche. Locking myself to a single provider would be a serious productivity bottleneck.&lt;/p&gt;

&lt;p&gt;The catch: every one of these tools has reinvented the same primitive — the &lt;a href="https://geminicli.com/docs/core/subagents/" rel="noopener noreferrer"&gt;&lt;strong&gt;subagent&lt;/strong&gt;&lt;/a&gt; — and given it a slightly different shape. I got tired of maintaining the same persona five times.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/fmind/agent-supagents" rel="noopener noreferrer"&gt;&lt;strong&gt;supagents&lt;/strong&gt;&lt;/a&gt;: a single markdown source, compiled to every coding agent I use.&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.amazonaws.com%2Fuploads%2Farticles%2Fvi9jwwx4r4iv9nzduyug.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2Fvi9jwwx4r4iv9nzduyug.jpeg" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Compile a single AI supagent into multiple AI subagents — &lt;a href="https://github.com/fmind/agent-supagents" rel="noopener noreferrer"&gt;https://github.com/fmind/agent-supagents&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The subagent fragmentation problem
&lt;/h3&gt;

&lt;p&gt;Subagents are one of the best additions to modern coding agents in the last year. They isolate workloads, keep MCP servers and tools out of the main session’s context, and let you ship richer instructions through progressive disclosure. Claude Code has &lt;a href="https://docs.claude.com/en/docs/claude-code/sub-agents" rel="noopener noreferrer"&gt;agents&lt;/a&gt;, Gemini CLI has them, &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-instructions" rel="noopener noreferrer"&gt;Copilot in VS Code&lt;/a&gt; has them, &lt;a href="https://docs.cursor.com/" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt; has them, &lt;a href="https://opencode.ai/" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; and &lt;a href="https://kilocode.ai/" rel="noopener noreferrer"&gt;Kilo Code&lt;/a&gt; have them.&lt;/p&gt;

&lt;p&gt;The persona I want is identical across all of them: &lt;em&gt;“You are a code-investigation expert. You read first, edit never, and you cite file:line for every claim.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The configuration is not. Each platform wants a different YAML frontmatter shape, a different directory layout, a different file extension. Claude wants tools: Read, Grep, Glob and a model field. Gemini wants kind: local and an mcp_servers block. Copilot wants target: vscode and a list of allowed models. The bodies are roughly the same prose, but the metadata diverges.&lt;/p&gt;

&lt;p&gt;I tried hand-syncing for a while. It does not scale. You tweak the persona once on a Friday afternoon, forget to copy it across, and three weeks later you are debugging why “the same agent” behaves differently on two laptops.&lt;/p&gt;
&lt;h3&gt;
  
  
  The common ground that almost works
&lt;/h3&gt;

&lt;p&gt;The good news is that the industry is converging on a shared root: the &lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; file at the repository root, and the .agents/ directory next to it. &lt;a href="https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions" rel="noopener noreferrer"&gt;GitHub now accepts AGENTS.md&lt;/a&gt; as a valid Copilot instruction file. &lt;a href="https://geminicli.com/docs/cli/skills/" rel="noopener noreferrer"&gt;Gemini CLI reads skills out of .agents/skills/&lt;/a&gt;. Claude Code, Cursor, and OpenCode all respect similar conventions.&lt;/p&gt;

&lt;p&gt;This is real progress. A single AGENTS.md and a single .agents/skills/ tree can drive a Copilot session, a Gemini run, and a Claude Code job — without touching anything tool-specific.&lt;/p&gt;

&lt;p&gt;But subagents have not landed in that shared ground yet. Each tool still keeps its agent definitions in its own private folder: .claude/agents/, .gemini/agents/, .github/agents/, and so on. There is no agents.md-equivalent for subagents.&lt;/p&gt;

&lt;p&gt;That is the gap supagents fills.&lt;/p&gt;
&lt;h3&gt;
  
  
  How supagents works
&lt;/h3&gt;

&lt;p&gt;Supagents is a small Python CLI. You write &lt;em&gt;one&lt;/em&gt; markdown file per agent in .agents/supagents/.md (project) or ~/.agents/supagents/.md (global). The CLI compiles that source into one output per target tool, dropping each compiled file into the location the target expects.&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.amazonaws.com%2Fuploads%2Farticles%2Ff43stoqgzaybcj77m9bt.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.amazonaws.com%2Fuploads%2Farticles%2Ff43stoqgzaybcj77m9bt.png" width="800" height="453"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;One supagents source compiles into per-target agent files for Claude Code, Gemini CLI, GitHub Copilot, Cursor, OpenCode, and Kilo Code&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The design is deliberately small. There are only two layers in the source file: shared frontmatter, and per-target blocks. A handful of UPPERCASE directives let you bend the output without leaving the file.&lt;/p&gt;
&lt;h3&gt;
  
  
  The source file
&lt;/h3&gt;

&lt;p&gt;Here is a real source for an investigation agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-investigator&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Explore unfamiliar codebases without editing.&lt;/span&gt;

&lt;span class="na"&gt;CLAUDE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob, Bash&lt;/span&gt;

&lt;span class="na"&gt;GEMINI&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;context7&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@upstash/context7-mcp@latest"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;COPILOT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vscode&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;APPEND_BODY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;## Copilot-specific&lt;/span&gt;
    &lt;span class="s"&gt;Reference tools with `#tool:&amp;lt;name&amp;gt;`.&lt;/span&gt;
&lt;span class="s"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# Code Investigator&lt;/span&gt;

&lt;span class="s"&gt;You are a specialized code-investigation agent. Read the relevant files&lt;/span&gt;
&lt;span class="s"&gt;before answering. Cite `file:line` for every non-trivial claim. Never&lt;/span&gt;
&lt;span class="s"&gt;edit code; if a fix is needed, propose it as a diff in the response.&lt;/span&gt;

&lt;span class="s"&gt;When the user asks "where is X?", search broadly across naming&lt;/span&gt;
&lt;span class="s"&gt;conventions before reporting "not found".&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The conventions are simple enough that I never need to read the docs again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lowercase keys&lt;/strong&gt; at the top level (like name, description) are shared frontmatter — copied verbatim into every output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UPPERCASE keys&lt;/strong&gt; at the top level (CLAUDE, GEMINI, COPILOT, CURSOR, OPENCODE, KILO) are target blocks. Each block holds the frontmatter that &lt;em&gt;only that target&lt;/em&gt; understands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lowercase keys inside a target block&lt;/strong&gt; (model, tools, …) become that target’s frontmatter, verbatim. Supagents does not translate or normalize fields. If Claude wants tools: Read, Grep and Gemini wants tools: [“*”], you write them both — and that is fine, because they live in different blocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UPPERCASE keys inside a target block&lt;/strong&gt; are directives — they shape the build instead of the output frontmatter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These two extra directives extend the generation process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OUTPUT&lt;/strong&gt; : override the destination path for one target. Useful when a tool wants the file in an unusual place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APPEND_BODY&lt;/strong&gt; : append target-specific markdown to the shared body. Great for tool-specific syntax (Copilot’s #tool: references, for example) that would confuse the other agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The body of the markdown — everything after the frontmatter — is the persona. It is shared across all targets unless APPEND_BODY extends it. This is the part you write &lt;em&gt;once&lt;/em&gt; and stop hand-syncing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verbatim, on purpose
&lt;/h3&gt;

&lt;p&gt;I made a deliberate choice to keep the per-target frontmatter verbatim. Supagents does &lt;strong&gt;not&lt;/strong&gt; try to translate model: sonnet into Gemini’s equivalent, or rewrite tools: Read, Grep into Copilot’s #tool: syntax. Every coding tool moves fast, breaks frontmatter conventions on minor releases, and adds new fields I have never heard of. A schema-translation layer would be obsolete before I shipped it.&lt;/p&gt;

&lt;p&gt;Verbatim has a cost — you write each target block yourself — but it has one big payoff: when Claude Code adds a new field next week, supagents already supports it. The compiler is just a YAML splitter and a file router.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CLI
&lt;/h3&gt;

&lt;p&gt;Four commands cover the entire workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;supagents build &lt;span class="o"&gt;[&lt;/span&gt;SCOPE] &lt;span class="c"&gt;# compile sources → outputs&lt;/span&gt;
supagents clean &lt;span class="o"&gt;[&lt;/span&gt;SCOPE] &lt;span class="c"&gt;# remove orphaned outputs&lt;/span&gt;
supagents list &lt;span class="o"&gt;[&lt;/span&gt;SCOPE] &lt;span class="c"&gt;# show every source and its outputs&lt;/span&gt;
supagents init NAME &lt;span class="c"&gt;# scaffold a new source from template&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SCOPE is either project (the .agents/supagents/ next to your code) or global (the ~/.agents/supagents/ in your home). Skip it and supagents picks based on where you run.&lt;/p&gt;

&lt;p&gt;The flags I reach for daily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;— dry-run — preview every write without touching the filesystem.&lt;/li&gt;
&lt;li&gt;— check — exit non-zero if any output would change. This is the CI flag. Wire it into a GitHub Action and you get a hard guarantee that committed sources match committed outputs.&lt;/li&gt;
&lt;li&gt;— target CLAUDE (repeatable) — operate on a single target. Great when you are iterating on a Gemini-only tweak and don’t want to rewrite five files.&lt;/li&gt;
&lt;li&gt;— verbose — print the unchanged files too. Helpful when something is mysteriously not updating and you want to confirm supagents &lt;em&gt;saw&lt;/em&gt; the source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Builds are idempotent. If a source has not changed since last build, supagents preserves the output’s mtime so file watchers and pre-commit hooks don’t re-fire on noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre-commit and CI integration
&lt;/h3&gt;

&lt;p&gt;I run supagents in two places. Locally, as a pre-commit hook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .pre-commit-config.yaml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/fmind/agent-supagents&lt;/span&gt;
  &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1.0.0&lt;/span&gt;
  &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;supagents-build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches the common mistake of editing .agents/supagents/code-investigator.md and forgetting to commit the regenerated .claude/agents/code-investigator.md.&lt;/p&gt;

&lt;p&gt;In CI, I run supagents build — check as a separate step. If someone edits an output by hand instead of editing the source, the check fails and the PR cannot land. Outputs are always derived; sources are always authoritative.&lt;/p&gt;

&lt;h3&gt;
  
  
  A configuration file when defaults are not enough
&lt;/h3&gt;

&lt;p&gt;By default, supagents knows where each of the six built-in targets wants its files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE&lt;/strong&gt;  — project .claude/agents/, global ~/.claude/agents/, suffix .md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GEMINI&lt;/strong&gt;  — project .gemini/agents/, global ~/.gemini/agents/, suffix .md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;COPILOT&lt;/strong&gt;  — project .github/agents/, global ~/.copilot/agents/, suffix .agent.md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CURSOR&lt;/strong&gt;  — project .cursor/agents/, global ~/.cursor/agents/, suffix .md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPENCODE&lt;/strong&gt;  — project .opencode/agents/, global ~/.config/opencode/agents/, suffix .md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KILO&lt;/strong&gt;  — project .kilo/agents/, global ~/.config/kilo/agents/, suffix .md&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a tool moves its agents folder — and it will — you don’t need to wait for a supagents release. Drop a ~/.config/supagents/config.yaml and override only what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;claude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;global_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/.config/claude-code/agents&lt;/span&gt;
    &lt;span class="na"&gt;project_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.claude-code/agents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything you omit falls back to the bundled defaults. The same mechanism lets you register a brand-new target without touching the source code, which I expect to use the moment the next coding agent ships.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it matters
&lt;/h3&gt;

&lt;p&gt;The bigger bet is that subagents will eventually land in the shared .agents/ ground, the way AGENTS.md already has. When that happens, supagents becomes a transition tool — and that is the point. I would rather build a bridge that becomes obsolete than wait for every vendor to converge on a standard while my workflow rots.&lt;/p&gt;

&lt;p&gt;In the meantime, supagents lets me do three things I could not do before:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write a persona once.&lt;/strong&gt; No more cmd-find-and-replace across five YAML files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship subagents in a project.&lt;/strong&gt; Commit the .agents/supagents/ source, list supagents build in CONTRIBUTING.md, and every contributor — whatever coding agent they use — gets the same agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promote my best agents to global.&lt;/strong&gt; When a project-scoped agent earns its keep, I move it to ~/.agents/supagents/ and it follows me into every repo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are running more than one coding agent — and most of us are, whether we admit it or not — give it a try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;supagents
supagents init code-investigator
supagents build &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository is at &lt;a href="https://github.com/fmind/agent-supagents" rel="noopener noreferrer"&gt;github.com/fmind/agent-supagents&lt;/a&gt;. Issues and pull requests welcome — especially for new target adapters. I want this to outgrow my own workflow.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://fmind.medium.com/ai-agents-as-an-operating-system-rediscovering-the-linux-philosophy-f0e76f29ebdb" rel="noopener noreferrer"&gt;Linux philosophy&lt;/a&gt; taught us that small tools beat big protocols. The same is becoming true for AI agents: a tiny CLI that does one thing — compile a single source to many targets — beats yet another framework that tries to own the whole stack. Supagents is my attempt at the &lt;em&gt;one thing well&lt;/em&gt; part. The “combine them to solve complex problems” part is up to you.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>opensource</category>
      <category>artificialintelligen</category>
      <category>coding</category>
    </item>
    <item>
      <title>AI Agents as an Operating System: Rediscovering the Linux Philosophy</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Sat, 14 Mar 2026 07:06:11 +0000</pubDate>
      <link>https://dev.to/fmind/ai-agents-as-an-operating-system-rediscovering-the-linux-philosophy-3098</link>
      <guid>https://dev.to/fmind/ai-agents-as-an-operating-system-rediscovering-the-linux-philosophy-3098</guid>
      <description>&lt;p&gt;We are building the most advanced AI systems in history, yet the best way to control them relies on paradigms from the 1970s. I see developers wrestling with this friction daily, trying to bridge the gap between bleeding-edge models and legacy toolchains.&lt;/p&gt;

&lt;p&gt;As of 2026, a simpler and clearer trend is emerging: &lt;strong&gt;the Command Line Interface (CLI) is becoming the most practical foundation for building agents&lt;/strong&gt;. Tools like &lt;a href="https://openclaw.ai/" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt; and the &lt;a href="https://github.com/googleworkspace/cli" rel="noopener noreferrer"&gt;Google Workspace CLI&lt;/a&gt; demonstrate this well. Handing an agent a raw shell and a file system is often faster and more reliable than wrapping it in a complex protocol. As Eric Holmes noted in &lt;a href="https://ejholmes.github.io/2026/02/28/mcp-is-dead-long-live-the-cli.html" rel="noopener noreferrer"&gt;&lt;em&gt;MCP is dead. Long live the CLI&lt;/em&gt;&lt;/a&gt;, modern LLMs already excel at using standard command-line utilities. These tools are lightweight, trivial to debug, and compose naturally.&lt;/p&gt;

&lt;p&gt;To understand why this approach works, we need to look at where agent protocols struggled, and why the path forward means returning to the Linux philosophy.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A-dVjqEmbdAmROydo" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A-dVjqEmbdAmROydo" width="1024" height="683"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Kevin Horvat on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with MCP (Model Context Protocol)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; was one of the first major agent protocols to emerge. Heavily inspired by how VS Code extensions work, its goal was noble: create a standardized way to expose all available resources and tools to an LLM.&lt;/p&gt;

&lt;p&gt;In practice, however, MCP suffers from severe architectural flaws for everyday agentic workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context Bloat:&lt;/strong&gt; MCP typically exposes all tools and their schemas at once. Massive tool descriptions eat up valuable context windows. On my Gemini CLI, simply booting up and saying “Hello” cost 50k input tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Mess:&lt;/strong&gt; The protocol tries to handle too many scenarios. It combines local runners (e.g., Docker, uvx, npx, …), remote execution, API keys, and OAuth into a single, often fragile deployment model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redundant Authentication:&lt;/strong&gt; As Holmes pointed out, you often have to re-authenticate specifically for the MCP and define an entirely new set of tools, needlessly duplicating your existing environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verbose Returns:&lt;/strong&gt; Results are returned directly in the protocol’s format to the LLM, bloating the context even further with massive JSON structures rather than clean, human-readable text.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ MCP: Experience from the Field
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development:&lt;/strong&gt; Personally, I don’t use any MCPs on my local machine anymore. It’s too bloated. I refuse to re-authenticate to yet another tool wrapper, and micromanage them by manually selecting which tools the agent should use for a given task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production:&lt;/strong&gt; I often tell my team that MCPs are like the old regex joke: &lt;em&gt;You had a problem that required MCP, now you have two problems.&lt;/em&gt; They lack maturity, and it’s rarely clear if a specific MCP was built for a slick local dev experience or for robust production. They are incredibly hard to debug, and I frequently find myself monkey-patching them just to keep pipelines running smoothly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A2A (Agent-to-Agent) Is Not a Tooling Protocol
&lt;/h3&gt;

&lt;p&gt;For a long time, I believed &lt;a href="https://a2a-protocol.org/latest/" rel="noopener noreferrer"&gt;Agent-to-Agent (A2A)&lt;/a&gt; communication would emerge as the compelling alternative to tool-binding protocols like MCP. While A2A remains the best way to orchestrate agents across different domains, it is not a protocol meant for low-to-medium level tool execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Double-Token Tax:&lt;/strong&gt; If you have a client agent delegating a simple task to a remote agent via A2A, you are paying token costs and incurring latency for &lt;em&gt;two&lt;/em&gt; LLMs in the loop. For low-level execution, the cost far outweighs the benefits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rigid Abstractions:&lt;/strong&gt; The remote agent comes with its own baked-in instructions and tools. While great for isolation, it’s highly detrimental if the local client agent needs to dynamically override or tweak how the remote task is executed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Overhead:&lt;/strong&gt; A2A inherently treats everything as a remote network call. This is powerful for distributed systems, but absolute overkill for local development tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ A2A: Experience from the Field
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development:&lt;/strong&gt; I don’t know anyone actually using A2A in their local development loop. Providers like GitHub tend to build their own proprietary APIs to call remote agents. When you operate inside a closed ecosystem, it’s often faster and easier to use native APIs than to force-fit an external protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production:&lt;/strong&gt; I think A2A is incredibly promising here, and we already leverage it in production. It’s a fantastic approach for large organizations where you need to mirror complex corporate structures, allowing agents to delegate high-level tasks to specialized “worker” agents at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent Skills Are Too Abstract
&lt;/h3&gt;

&lt;p&gt;I previously thought &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; were going to be the golden hammer — a concept I explored in &lt;a href="https://fmind.medium.com/mlops-coding-skills-bridging-the-gap-between-specs-and-agents-4c8170570eba" rel="noopener noreferrer"&gt;&lt;em&gt;MLOps Coding Skills: Bridging the Gap Between Specs and Agents&lt;/em&gt;&lt;/a&gt;. I was wrong.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Premature Abstraction:&lt;/strong&gt; Skills are designed to be reusable. The trap is making them overly verbose on Day 1, trying to account for edge cases that don’t exist yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context over Skills:&lt;/strong&gt; On a new project, you are much better off using an &lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; file, system instructions, or &lt;a href="https://fmind.medium.com/the-5xp-framework-steering-ai-coding-agents-from-chaos-to-success-83fbdb318b2b" rel="noopener noreferrer"&gt;context files like the 5XP framework&lt;/a&gt;. They are vastly easier to operate and tweak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incomplete Taxonomy:&lt;/strong&gt; Structuring everything as a “skill” is a flawed mental model. Not everything is a skill. Way-of-working, product objectives, and business context cannot be neatly packaged into executable skills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The “Static Fit” Problem:&lt;/strong&gt; When you import open-source skills or skills written by others, they rarely align 100% with your needs. Because they are static, they either fit perfectly, or they break. There is no inherent mechanism for the skill to learn or adapt to the user’s specific workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ Agent Skills: Experience from the Field
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development:&lt;/strong&gt; I use the &lt;a href="https://fmind.medium.com/the-5xp-framework-steering-ai-coding-agents-from-chaos-to-success-83fbdb318b2b" rel="noopener noreferrer"&gt;5XP framework&lt;/a&gt; now. I only extract a “skill” &lt;em&gt;a posteriori&lt;/em&gt; — after a major refactoring, when I actively want to reuse a specific workflow across multiple projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production:&lt;/strong&gt; Skills provide a clean way to formalize and version-control agent instructions to share among colleagues. They complement A2A beautifully: the A2A protocol provides the workers, while the Skills repository provides their standardized instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rediscovering the Linux Philosophy
&lt;/h3&gt;

&lt;p&gt;If bloated protocols and rigid abstractions are slowing us down, what is the alternative? We need an approach to agent tooling that is dynamic, composable, and lightweight. Unsurprisingly, the industry is circling back to the &lt;a href="https://en.wikipedia.org/wiki/Command-line_interface" rel="noopener noreferrer"&gt;CLI (Command-Line Interface)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For developers, treating the CLI as the primary interface for agents has undeniable benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Battle-Tested Maturity:&lt;/strong&gt; There are thousands of mature, edge-case-tested CLI tools already on the market. Furthermore, LLMs have ingested the man pages for these tools; they already know exactly how to use them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Environment:&lt;/strong&gt; A human can step in and run the exact same command. The environment is already authenticated, and debugging is trivial (standard error messages, exit codes, easily readable flags).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Bloat:&lt;/strong&gt; It’s incredibly lightweight. You don’t need to deploy a wrapper or a daemon. You just execute the command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infinite Composability:&lt;/strong&gt; Agents can natively pipe find, grep, jq, and curl together, without passing the intermediate tool output to the LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language Agnostic:&lt;/strong&gt; It doesn’t matter if the underlying tool is written in Rust, Go, Python, or Bash. To the agent, it’s just a command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we are doing is rediscovering the &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy" rel="noopener noreferrer"&gt;&lt;strong&gt;Linux Philosophy&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Everything is a file (or a text stream).&lt;/li&gt;
&lt;li&gt;Write small tools that do one thing well.&lt;/li&gt;
&lt;li&gt;Combine them to solve complex problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🛠️ Experience from the Field
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development:&lt;/strong&gt; During my day-to-day development, I now rely almost entirely on CLI tools combined with raw text context. It is incredibly liberating. I’m deeply curious to see how far this pure approach can scale. We are even seeing frameworks adapt to this reality; for instance, the Google ADK recently &lt;a href="https://www.google.com/search?q=https://github.com/google/adk-python/blob/780093f389bfbffce965c89ca888d49f992219c1/src/google/adk/tools/bash_tool.py%23L62" rel="noopener noreferrer"&gt;added native bash tools&lt;/a&gt; to give agents direct shell access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Side Note: I finally feel less guilty about the&lt;/em&gt; &lt;a href="https://github.com/fmind/dotfiles" rel="noopener noreferrer"&gt;&lt;em&gt;1283+ commits on my dotfiles&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s Next? From Linux to Kubernetes for Agents
&lt;/h3&gt;

&lt;p&gt;Right now, the raw CLI is the 80/20 rule of agent development. It gives us maximum leverage with minimum setup, accomplishing 80% of what we need and making developers extremely productive locally. But local development is not the final destination.&lt;/p&gt;

&lt;p&gt;While giving an agent CLI access is like giving it a personal UNIX terminal, &lt;strong&gt;security and scale are the ultimate blockers for the CLI in production.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You cannot simply hand an autonomous LLM unconstrained bash access to your AWS account or your production database. Real-world deployment requires a rigorous security layer: strict authentication, Role-Based Access Control (RBAC), sandboxing, and immutable audit logs. This is a highly complex problem that raw CLI execution cannot solve safely at an enterprise scale.&lt;/p&gt;

&lt;p&gt;In traditional software, we didn’t abandon the Linux philosophy to build the cloud; we containerized and orchestrated it. We bridged the gap between a single bash instance and a globally distributed system.&lt;/p&gt;

&lt;p&gt;We need the exact same evolution for AI. To bridge the gap between heavy, bloated agent protocols and the lightweight-but-insecure raw CLI, we need a new paradigm. We need something that adheres strictly to the composability of Linux, but is built for autonomous systems at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My bet is that we don’t just need another protocol; we need an Operating System for Agents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just as the industry needed Kubernetes to safely orchestrate Linux containers across vast server networks, our agents will need an orchestration layer built specifically for AI workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Process Management:&lt;/strong&gt; Spinning agent loops up and down dynamically based on computing load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Granular RBAC:&lt;/strong&gt; Strict, declarative policies restricting exactly which binaries, data silos, and network endpoints an agent can touch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Service Discovery:&lt;/strong&gt; An Istio-like service mesh for agents, allowing them to route tasks to specialized peers without hardcoded endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Queues:&lt;/strong&gt; Enabling agents to share state and context asynchronously, freeing up expensive context windows.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fv88u7kwngyx6bpkc4i41.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.amazonaws.com%2Fuploads%2Farticles%2Fv88u7kwngyx6bpkc4i41.png" width="800" height="429"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Istio Architecture (Source: &lt;a href="https://istio.io/latest/docs/ops/deployment/architecture/" rel="noopener noreferrer"&gt;https://istio.io/latest/docs/ops/deployment/architecture/&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The history of software is wonderfully cyclical. We spent the last few years trying to invent complex new paradigms, only to rediscover the elegance of the Linux philosophy. As we transition from local development into enterprise-grade production, it’s becoming abundantly clear: we’ve finally found the Linux for agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The next frontier is building the Kubernetes to run it.&lt;/strong&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AOmxvtjOjJ6lYI_-l" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AOmxvtjOjJ6lYI_-l" width="1024" height="576"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Growtika on Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>artificialintelligen</category>
      <category>llm</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The 5xP Framework: Steering AI Coding Agents from Chaos to Success</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Sat, 28 Feb 2026 12:13:44 +0000</pubDate>
      <link>https://dev.to/fmind/the-5xp-framework-steering-ai-coding-agents-from-chaos-to-success-3936</link>
      <guid>https://dev.to/fmind/the-5xp-framework-steering-ai-coding-agents-from-chaos-to-success-3936</guid>
      <description>&lt;p&gt;AI Coding — or &lt;a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/" rel="noopener noreferrer"&gt;Spec-Driven Development&lt;/a&gt; — is a recent trend that amazes as much as it scares IT engineers. We now have access to powerful models capable of writing entire applications, but jumping from “Hello World” to a production-grade enterprise system exposes a glaring bottleneck: &lt;strong&gt;Context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hardest challenge isn’t the coding itself; it’s explaining to the AI Coding Agent &lt;em&gt;how&lt;/em&gt; to work on the task. How do you capture your style, preferences, constraints, environment, tools, and workflow?&lt;/p&gt;

&lt;p&gt;In my previous article, &lt;a href="https://fmind.dev" rel="noopener noreferrer"&gt;&lt;em&gt;How I Revamped My Portfolio Website in 5 Nights Using AI Agents&lt;/em&gt;&lt;/a&gt;, I shared how setting up explicit context was the secret to steering the AI successfully. I refused to just “&lt;a href="https://x.com/karpathy/status/1886192184808149383?lang=en" rel="noopener noreferrer"&gt;vibe code&lt;/a&gt;” and instead relied on firm architectural guidance.&lt;/p&gt;

&lt;p&gt;In this follow-up article, I present the exact structure I use for my AI-assisted projects. After exploring many iterations and tools, I found that the key to success is providing the AI with the right context in a brutally simple, highly maintainable way.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ALqFjz7H3CoPnlJu5" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ALqFjz7H3CoPnlJu5" width="1024" height="576"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by ZHIDA LI on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;To make it easier to adopt, I’ve created the&lt;/em&gt; &lt;a href="https://github.com/fmind/ai-coding-5xp-template" rel="noopener noreferrer"&gt;&lt;em&gt;AI Coding 5xP Template&lt;/em&gt;&lt;/a&gt; &lt;em&gt;repository. This repository acts as the single source of truth for the framework, providing a ready-to-use directory structure you can use for your own projects.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Context is Everything
&lt;/h3&gt;

&lt;p&gt;AI Coding Agents are amazing at parsing documentation, but they lack common sense. Put yourself in the shoes of an AI agent: you are dropped into a closed room, and you don’t know the person you are assisting. You don’t know who you are working for or for what purpose. You just have access to the code and whatever you can infer from it.&lt;/p&gt;

&lt;p&gt;To steer the agent in the right direction, context is the fuel. It adapts the LLM to your skill level, your objective, and your expectations. But bringing context properly is a true challenge, and I know many engineers who struggle with it.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Pitfalls of Current Solutions
&lt;/h3&gt;

&lt;p&gt;I have experimented with several approaches to provide context, and each comes with its own trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autocompletion &amp;amp; Inference&lt;/strong&gt; : Tools like &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt; and &lt;a href="https://antigravity.google/" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt; are great for getting decent work done by inferring information from your existing codebase. However, they struggle when you start a project from scratch or when you have to rigidly copy-paste instructions over and over again to keep the agent aligned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Scaffolding&lt;/strong&gt; : Frameworks like &lt;a href="https://github.com/spec-kit" rel="noopener noreferrer"&gt;Spec-kit&lt;/a&gt; and &lt;a href="https://github.com/gemini-cli-extensions/conductor" rel="noopener noreferrer"&gt;Conductor&lt;/a&gt; allow you to prepare your context by answering questions. In practice, I found these tools too verbose. They infer a lot of content from your answers that you wouldn’t necessarily write yourself, leading to dilution of the core instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol Integrations&lt;/strong&gt; : The &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; is a fantastic standard for extending the capacities of your coding model by securely exposing external tools. But relying purely on MCP can bloat your LLM’s context window. Once you hit 100 tools, the model loses its focus, and you end up micromanaging tool selection instead of writing code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;&lt;strong&gt;Agent Skills&lt;/strong&gt;&lt;/a&gt;: Dynamically loading specific skills into your LLM is amazing for quick task execution via lazy loading. However, it’s incredibly hard to generalize skills on day one. It’s often more practical to create specific rules for your current project first, and later refactor the recurring ones into standalone skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  My Solution: The 5xP Framework
&lt;/h3&gt;

&lt;p&gt;I found that the most sustainable strategy to steer an AI Coding Agent is to use flat, readable Markdown files. I organize them using what I call the &lt;strong&gt;5xP Framework&lt;/strong&gt; : Product, Platform, Process, Profile, and Principle.&lt;/p&gt;

&lt;p&gt;Here is how to break it down. While you can customize it, the default template provides 4 files directly under a context/ directory:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/context/PRODUCT.md" rel="noopener noreferrer"&gt;&lt;strong&gt;PRODUCT.md&lt;/strong&gt;&lt;/a&gt;: The objective. What are we building? Who are the users? What is the business logic? This prevents the AI from over-engineering features that don’t align with the goals.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/context/PLATFORM.md" rel="noopener noreferrer"&gt;&lt;strong&gt;PLATFORM.md&lt;/strong&gt;&lt;/a&gt;: The technical stack. What tools, environment, frameworks, and architectural patterns are we strictly adhering to?&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/context/PROCESS.md" rel="noopener noreferrer"&gt;&lt;strong&gt;PROCESS.md&lt;/strong&gt;&lt;/a&gt;: The workflow. How exactly should the AI collaborate with you? What are the quality assurance standards and AI engagement rules?&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/context/PROFILE.md" rel="noopener noreferrer"&gt;&lt;strong&gt;PROFILE.md&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;(Optional but recommended)&lt;/em&gt;: Who are you? Explaining your background, communication style, and expertise prevents the agent from making wrong assumptions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;strong&gt;5th xP&lt;/strong&gt; is the most important: &lt;strong&gt;Principle&lt;/strong&gt;. These are your Ten Commandments, and you should put this information in an &lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; file at the root of your project. Acting as the master entry point for the AI, the principles sit at the top, and the file then links to the other 4xPs, explicitly instructing the agent to read them when necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule of Thumb:&lt;/strong&gt; Keep each file to &lt;strong&gt;1 page maximum&lt;/strong&gt;. You should not have to scroll to read the content. This forces you to be concise, avoiding information overload for both you and the LLM.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example Project Structure
&lt;/h3&gt;

&lt;p&gt;Let’s look at a fictional project — an open-source AI task manager called TaskBrain — and see how this structure is applied in practice based on the template.&lt;/p&gt;

&lt;p&gt;The repository structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;taskbrain/
├── src/
├── tests/
├── context/
│ ├── PLATFORM.md
│ ├── PROCESS.md
│ ├── PRODUCT.md
│ └── PROFILE.md
└── AGENTS.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is exactly how you would wire the &lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; file to act as the master prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Agent Guidelines

Assume the persona of an expert AI Coding Assistant dedicated to this project.

## Principles

1. **Simplicity First** : Keep dependencies minimal and favor straightforward, readable solutions over complex alternatives.
2. **Proactive Partnership** : Anticipate potential issues and challenge decisions that contradict the project's constitution.
3. **Maintainable Code** : Prioritize code clarity, clean architecture, and consistent formatting across the entire codebase.
4. **Contextual Awareness** : Adhere to the guidelines established in the context files to ensure all contributions align with them.
5. **Security by Design** : Identify and mitigate security issues proactively. Treat data privacy and secrets handling as fundamental requirements.

## Context Navigation

Read the following context files as needed to understand the project's core rules and guidelines.
Suggest to the user to update the context files as needed to reflect the project's current state.

- **[context/PROFILE.md](context/PROFILE.md)** (Who): My background, communication style, and expertise.
- **[context/PRODUCT.md](context/PRODUCT.md)** (What): Core objectives, target audience, and business logic.
- **[context/PLATFORM.md](context/PLATFORM.md)** (Where): Technology stack, infrastructure, and architectural principles.
- **[context/PROCESS.md](context/PROCESS.md)** (How): Workflows, AI engagement rules, and quality assurance standards.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By keeping the root &lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; file short and linking to specific sub-files in a context/ directory, the AI agent can dynamically lazy-load exactly what it needs, precisely when it needs it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Field-Tested Results
&lt;/h3&gt;

&lt;p&gt;I have thoroughly tested this framework on two distinct projects: &lt;a href="https://github.com/fmind/fmind.dev" rel="noopener noreferrer"&gt;completely revamping my personal website&lt;/a&gt; and bootstrapping a complex new project centered on AI Agents. In both cases, the results were night and day compared to previous approaches.&lt;/p&gt;

&lt;p&gt;The true power of this framework lies in its &lt;strong&gt;human-friendliness&lt;/strong&gt; : the files are simple, focused, and I can quickly steer the model in a new direction just by tweaking a few bullet points in a Markdown file.&lt;/p&gt;

&lt;p&gt;Furthermore, it does not bloat the LLM. By providing what essentially acts as a “table of contents” in the root &lt;a href="https://github.com/fmind/ai-coding-5xp-template/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; (similar to exposing agent skills), the model only pulls the context it needs for the task at hand. This naturally enforces a healthy rhythm: you spend &lt;strong&gt;20% of your time thinking&lt;/strong&gt; and structuring the context, allowing the AI to smoothly handle the &lt;strong&gt;80% implementation&lt;/strong&gt; burden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Every expert I know keeps iterating on how to collaborate with AI Coding Agents. Many approaches are either far too verbose, drowning the LLM in noise, or far too simplistic, leading to repetitive manual prompting.&lt;/p&gt;

&lt;p&gt;The 5xP framework is the best trade-off I have found so far: it is brutally simple, easy to maintain natively in Git, and it works across almost every LLM coding environment.&lt;/p&gt;

&lt;p&gt;It does not take long to set up, but it forces you to think clearly about your project’s shape before you write a single line of code. And in the era of AI engineering, thinking clearly is your greatest superpower.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A6oWUbRr5kWU6i3M2" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A6oWUbRr5kWU6i3M2" width="1024" height="683"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Van Tay Media on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ready to start? Grab the &lt;a href="https://github.com/fmind/ai-coding-5xp-template" rel="noopener noreferrer"&gt;AI Coding 5xP Template&lt;/a&gt; on GitHub to get up and running instantly.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>artificialintelligen</category>
      <category>coding</category>
      <category>agents</category>
    </item>
    <item>
      <title>How I Revamped My Portfolio Website in 5 Nights Using AI Agents</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Thu, 19 Feb 2026 20:43:26 +0000</pubDate>
      <link>https://dev.to/fmind/how-i-revamped-my-portfolio-website-in-5-nights-using-ai-agents-57d4</link>
      <guid>https://dev.to/fmind/how-i-revamped-my-portfolio-website-in-5-nights-using-ai-agents-57d4</guid>
      <description>&lt;p&gt;I see many friends and acquaintances generating amazing applications in mere weeks. We are in the midst of a craze of innovation, an era where inspired people can bring their ideas to life without being strictly bounded by the usual constraints of tool mastery.&lt;/p&gt;

&lt;p&gt;This means there is no time to slack off. The go-getters will not wait for you to catch up. One representative aspect of this fast-moving landscape is your digital presence — your portfolio.&lt;/p&gt;

&lt;p&gt;As a freelance AI/ML Architect, I realized I needed a space that truly reflected my expertise. In this article, I present the revamp of my own portfolio: &lt;a href="https://fmind.dev" rel="noopener noreferrer"&gt;fmind.dev&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.amazonaws.com%2Fuploads%2Farticles%2F0r1suucdet9pejwokqst.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.amazonaws.com%2Fuploads%2Farticles%2F0r1suucdet9pejwokqst.png" width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;New Homepage of Fmind.dev&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Old and Dusty Website
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://sites.google.com/fmind.dev/fmind-dev/home" rel="noopener noreferrer"&gt;My previous website&lt;/a&gt; was built with Google Sites. It was cheap, highly functional, and effortless to maintain.&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.amazonaws.com%2Fuploads%2Farticles%2F6m4rmi6mkeptahmcm0iv.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.amazonaws.com%2Fuploads%2Farticles%2F6m4rmi6mkeptahmcm0iv.png" width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Previous version of Fmind.dev&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But functional is no longer enough in 2026, especially for a freelancer who constantly needs to be on the bleeding edge of technology. Google Sites afforded me very little control over styling, strict limitations on SEO, and — crucially — zero ability to easily evolve it using modern AI coding assistants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Something had to be done&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Preparing the Field: Setting Up the Agent
&lt;/h3&gt;

&lt;p&gt;The secret to a successful AI-assisted project isn’t just jumping in and prompting; it’s about preparing the groundwork.&lt;/p&gt;

&lt;p&gt;I started by defining several &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;agent skills&lt;/a&gt; tailored to prepare my specific text stack. For this project, I created dedicated skills covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend Development&lt;/li&gt;
&lt;li&gt;Frontend Development&lt;/li&gt;
&lt;li&gt;GCP Deployment&lt;/li&gt;
&lt;li&gt;GCP Observability&lt;/li&gt;
&lt;li&gt;Mobile Optimization&lt;/li&gt;
&lt;li&gt;Project Tooling&lt;/li&gt;
&lt;li&gt;SEO Optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, instead of continuously reminding the agent who I am and what I want, I explicitly created two context files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROFILE.md&lt;/strong&gt; : Outlining my professional identity, experience, and links.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Profile - Médéric Hurier (Fmind)

## Headline

Freelancer • AI/ML Architect &amp;amp; Engineer • AI Agents &amp;amp; MLOps • GCP Professional Cloud Architect • PhD in AI &amp;amp; Computer Security

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DESIGN.md&lt;/strong&gt; : Defining my brand identity (e.g., “Space &amp;amp; Tech” aesthetic).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Website Design

## Brand Identity

A professional, advanced, and modern digital presence for an AI/ML Architect.

Blending clean and modern style with a "Space &amp;amp; Tech" aesthetic to reflect deep expertise in Artificial Intelligence and MLOps.

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By establishing these foundational documents, I set the ground rules. The AI agent had immediate access to my personality and brand identity, saving me from having to explain the context over and over again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building the Website: Steering the AI
&lt;/h3&gt;

&lt;p&gt;Rather than “vibe coding” everything and blindly compiling the results, I made a strict rule: I would review every single file generated by the agent. As an engineer, I refuse to be responsible for a codebase I haven’t read or understood.&lt;/p&gt;

&lt;p&gt;Despite the agent’s impressive capabilities, I noted several weaknesses that you must manage when using AI agents to generating code:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Agents don’t care about your brand. They just want to get the task done.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;— A harsh truth of AI coding&lt;/p&gt;

&lt;p&gt;It’s entirely up to you to rigorously maintain your identity and ensure the output matches your needs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Code quickly degenerates. Without supervision, AI can generate piles and piles of code lacking underlying logic.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agents are fantastic at refactoring, but &lt;em&gt;you&lt;/em&gt; are the architect who must point them in the right direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choosing the right tech stack is key.&lt;/strong&gt; Call me old school, but I demand mastery over what I produce. I decided to use &lt;strong&gt;Python&lt;/strong&gt; as the foundational layer for my programming logic. I am confident in my ability to maintain, debug, and evolve a Python-based architecture over the long term.&lt;/p&gt;

&lt;p&gt;Once you actively tackle these limitations, the results are breathtaking. While I generally don’t enjoy writing repetitive boilerplate or templates, the AI agent excels at it and never gets tired. You can direct its focus entirely to the frontend, backend, deployment, SEO, or mobile optimization. Watching the pieces fall into place gives you an incredible dopamine rush.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;I was able to finalize the website from scratch in just &lt;strong&gt;5 nights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This rapid timeline included everything: generating the base components, extensive optimizations, refactoring, and setting up proper deployment pipelines (including analytics and observability). While I could have let the agent run entirely autonomously, it is &lt;em&gt;my&lt;/em&gt; website; I wanted to be an active part of the process.&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.amazonaws.com%2Fuploads%2Farticles%2F0z6kogyrv13cpsjfsizk.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.amazonaws.com%2Fuploads%2Farticles%2F0z6kogyrv13cpsjfsizk.png" width="800" height="392"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Result of PageSpeed Insights (LightHouse)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m thrilled to report that the new site achieved a &lt;strong&gt;100% Lighthouse score&lt;/strong&gt; across every single category. The site is fast, modern, and beautifully aligned with my brand. I would have never been able to produce this level of polish by myself in such a short timeframe, and I’m incredibly proud of the result.&lt;/p&gt;

&lt;p&gt;For context on the effort, here is a quick look at the codebase generated and reviewed during those 5 nights:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.com/AlDanial/cloc v 1.98 T=0.10 s (915.2 files/s, 30379.3 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
HTML 57 33 40 1257
Markdown 11 277 0 580
Python 12 138 79 368
TOML 1 8 1 84
YAML 3 0 3 81
CSS 2 9 0 41
Text 4 7 0 33
JSON 1 0 0 31
Dockerfile 1 1 2 27
-------------------------------------------------------------------------------
SUM: 92 473 125 2502
-------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusions
&lt;/h3&gt;

&lt;p&gt;AI Coding is an absolute game-changer. I highly encourage any developer or freelancer to revamp their own website as soon as possible. It is the perfect, tightly-scoped exercise to discover the true, practical capacity of these tools for yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with clear context files&lt;/strong&gt; to ground your agent’s understanding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not blindly trust generated code;&lt;/strong&gt; review everything to maintain architectural control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid “shiny object syndrome.”&lt;/strong&gt; Relying entirely on AI without architectural vision can lead to generic, unmaintainable results. Find the right balance between automation and engineering rigor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the final result at &lt;a href="https://fmind.dev" rel="noopener noreferrer"&gt;fmind.dev&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.amazonaws.com%2Fuploads%2Farticles%2Fd5p7sgek0f7qlcck0zfp.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.amazonaws.com%2Fuploads%2Farticles%2Fd5p7sgek0f7qlcck0zfp.png" width="799" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;About me on Fmind.dev&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you tried ‘vibe coding’ on your own projects yet, let me know your experience in the comments!&lt;/p&gt;

</description>
      <category>artificialintelligen</category>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Chaigent: An affordable alternative to Gemini Enterprise on Google Cloud</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Fri, 06 Feb 2026 20:14:02 +0000</pubDate>
      <link>https://dev.to/fmind/chaigent-an-affordable-alternative-to-gemini-enterprise-on-google-cloud-32ah</link>
      <guid>https://dev.to/fmind/chaigent-an-affordable-alternative-to-gemini-enterprise-on-google-cloud-32ah</guid>
      <description>&lt;p&gt;The era of simple chatbots is over. Companies are now racing to build &lt;a href="https://fmind.medium.com/architecting-the-ai-agent-platform-a-definitive-guide-405750a3de44" rel="noopener noreferrer"&gt;&lt;strong&gt;AI Agent platforms&lt;/strong&gt;&lt;/a&gt; — systems that don’t just talk, but &lt;em&gt;act&lt;/em&gt;. Whether it’s a support bot resolving Jira tickets or a data analyst agent querying BigQuery, these new digital teammates need a platform that offers more than just text generation: they require reasoning, security, and enterprise-grade observability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/gemini/enterprise" rel="noopener noreferrer"&gt;&lt;strong&gt;Gemini Enterprise&lt;/strong&gt;&lt;/a&gt; provides a great path to achieving this on &lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Google Cloud&lt;/strong&gt;&lt;/a&gt;. It offers a comprehensive set of features including agent exposition, governance, integrated knowledge search, and a visual agent builder, connecting with backends like &lt;a href="https://cloud.google.com/products/agent-engine" rel="noopener noreferrer"&gt;&lt;strong&gt;Vertex AI Agent Engine&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://docs.cloud.google.com/dialogflow/cx/docs" rel="noopener noreferrer"&gt;&lt;strong&gt;Conversational Agent&lt;/strong&gt;&lt;/a&gt;, or &lt;a href="https://a2aprotocol.ai/" rel="noopener noreferrer"&gt;&lt;strong&gt;A2A&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, for some organizations or specific use cases, the cost can be a friction point. The catalog price sits at &lt;strong&gt;~$7/user/month&lt;/strong&gt; for agent users and &lt;strong&gt;~$35/user/month&lt;/strong&gt; for visual agent builders. While this pricing is competitive for knowledge workers who gain significant productivity, it can be prohibitive for large audiences with lower usage frequency, such as field workers or occasional users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter Chaigent:&lt;/strong&gt; &lt;a href="https://github.com/fmind/chaigent" rel="noopener noreferrer"&gt;&lt;strong&gt;https://github.com/fmind/chaigent&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fd5ybjuxkqco4k8yezmcp.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.amazonaws.com%2Fuploads%2Farticles%2Fd5ybjuxkqco4k8yezmcp.png" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Chaigent is an affordable alternative to Gemini Enterprise (Source: Gemini App)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this article, I present “Chaigent” (&lt;a href="https://chainlit.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Chainlit&lt;/strong&gt;&lt;/a&gt; + Agent), a cost-effective, DIY alternative to Gemini Enterprise on Google Cloud. It leverages the same powerful underlying reasoning engine but replaces the managed frontend with an open-source framework, giving you control over features and costs.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;

&lt;p&gt;Chaigent enables you to build a private, secure AI agent platform by combining serverless infrastructure with open-source tooling.&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.amazonaws.com%2Fuploads%2Farticles%2Fugnuds2ohznmtqzet2u4.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.amazonaws.com%2Fuploads%2Farticles%2Fugnuds2ohznmtqzet2u4.png" width="800" height="265"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Architecture of Chaigent (Source: Fmind.dev)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The architecture consists of three main layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frontend (&lt;/strong&gt;&lt;a href="https://chainlit.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Chainlit&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;on&lt;/strong&gt; &lt;a href="https://cloud.google.com/run" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloud Run&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;: A Python-based UI that handles user sessions, chat history, and authentication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend (&lt;/strong&gt;&lt;a href="https://cloud.google.com/products/agent-engine" rel="noopener noreferrer"&gt;&lt;strong&gt;Vertex AI Agent Engine&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;: The “brain” of the operation, capable of reasoning and tool use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence &amp;amp; Auth&lt;/strong&gt; : &lt;a href="https://cloud.google.com/sql" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloud SQL&lt;/strong&gt;&lt;/a&gt; for storing chat history and feedback, and &lt;a href="https://oauth.net/2/" rel="noopener noreferrer"&gt;&lt;strong&gt;OAuth&lt;/strong&gt;&lt;/a&gt; (Google, GitHub, etc.) for secure identity management.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach allows you to pay for &lt;strong&gt;consumption only&lt;/strong&gt; (Cloud Run CPU + Vertex AI tokens), significantly reducing costs for intermittent usage patterns compared to a flat per-seat license.&lt;/p&gt;
&lt;h3&gt;
  
  
  The “Do It Yourself” Trade-off
&lt;/h3&gt;

&lt;p&gt;Gemini Enterprise provides a managed, “batteries-included” platform with built-in governance and visual tools. Chaigent, in contrast, offers a code-first, developer-centric approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost Efficiency&lt;/strong&gt; : No monthly per-seat licensing fees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Customization&lt;/strong&gt; : You own the code. Want to add a custom feedback mechanism or a specific UI widget? You can.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform Independence&lt;/strong&gt; : Using &lt;a href="https://chainlit.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Chainlit&lt;/strong&gt;&lt;/a&gt; (frontend) and &lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;&lt;strong&gt;Google ADK&lt;/strong&gt;&lt;/a&gt; (backend) logic keeps you flexible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you lose (The “Subtext”):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Visual Builder&lt;/strong&gt; : You define agents in code, not a drag-and-drop UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Governance&lt;/strong&gt; : You must implement your own permission logic per agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ops Overhead&lt;/strong&gt; : You are responsible for deploying, securing, and updating the application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterpise Features&lt;/strong&gt; : Advanced features like Model Armor (&lt;a href="https://cloud.google.com/security/products/model-armor" rel="noopener noreferrer"&gt;&lt;strong&gt;Prompt Security&lt;/strong&gt;&lt;/a&gt;) and integrated Knowledge Search (&lt;a href="https://cloud.google.com/vertex-ai/docs/retrieval-augmented-generation" rel="noopener noreferrer"&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/a&gt;) require manual implementation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Implementation Highlights
&lt;/h3&gt;

&lt;p&gt;Chaigent is surprisingly simple to set up. Here is a glimpse of the code.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Defining the Agent
&lt;/h3&gt;

&lt;p&gt;The agent is defined declaratively using the &lt;a href="https://github.com/google/adk" rel="noopener noreferrer"&gt;&lt;strong&gt;Google ADK&lt;/strong&gt;&lt;/a&gt;. It’s just a Python object specifying the model and tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# chaigent/agent.py
root_agent = agent(
    name="chaigent",
    model="gemini-2.5-flash",
    description="answer questions with google search.",
    instruction="you are an expert researcher. you always stick to the facts.",
    tools=[google_search],
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Bridge (Chainlit Adapter)
&lt;/h3&gt;

&lt;p&gt;The app.py acts as the bridge. It connects the user’s chat session to the Vertex AI Agent Engine, handling the streaming response seamlessly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app.py

@cl.on_message
async def on_message(message: cl.Message):
    # Initialize response message
    answer = cl.Message(content="")
    await answer.send()

    # Retrieve session
    session = cl.user_session.get("session")
    user_id, session_id = session["userId"], session["id"]

    # Stream the query to Vertex AI
    response_stream = engine.async_stream_query(
        user_id=user_id, message=message.content, session_id=session_id
    )

    # Stream back the tokens
    async for chunk in response_stream:
        for part in chunk.get("content", {}).get("parts", []):
            text = part.get("text", "")
            if text:
                await answer.stream_token(text)
                await answer.update()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  User Experience
&lt;/h3&gt;

&lt;p&gt;Despite being a “DIY” solution, the user experience is premium. Chainlit provides features that users expect from modern chat apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rich Chat Interface&lt;/strong&gt; : Supports markdown, code highlighting, and streaming responses out of the box.&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.amazonaws.com%2Fuploads%2Farticles%2F1t81nqszlcx0eo1ocvjg.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.amazonaws.com%2Fuploads%2Farticles%2F1t81nqszlcx0eo1ocvjg.png" width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Chat interface of Chaigent&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication &amp;amp; Persistence&lt;/strong&gt; : Secure login screens and persisted chat history allow users to resume conversations across devices.&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.amazonaws.com%2Fuploads%2Farticles%2Fyi3tc6m8zpoqc8415wuk.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.amazonaws.com%2Fuploads%2Farticles%2Fyi3tc6m8zpoqc8415wuk.png" width="800" height="438"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Login screen of Chaigent&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Layer&lt;/strong&gt; : All interactions are stored in your own SQL database, giving you full ownership of the data for analytics or fine-tuning later.&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.amazonaws.com%2Fuploads%2Farticles%2Fb9istczsweoqlgl289qd.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.amazonaws.com%2Fuploads%2Farticles%2Fb9istczsweoqlgl289qd.png" width="799" height="438"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Home screen of Chaigent&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Chaigent is an excellent solution when &lt;strong&gt;cost efficiency&lt;/strong&gt; is the primary driver, particularly for large audiences with low individual usage.&lt;/p&gt;

&lt;p&gt;The decision comes down to ROI. At ~$7/month/user for Gemini Enterprise, you need to save each user at least one hour of work per month to break even. For knowledge workers, this is a no-brainer. But for field workers or casual users, a consumption-based “Pay-as-you-go” model like Chaigent might be the smarter financial move.&lt;/p&gt;

&lt;p&gt;If you are ready to trade some convenience for control and cost savings, go build your own agents!&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.amazonaws.com%2Fuploads%2Farticles%2Fyqtud4hao3w1r94gzykw.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.amazonaws.com%2Fuploads%2Farticles%2Fyqtud4hao3w1r94gzykw.png" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: Gemini App&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googlecloudplatform</category>
      <category>generativeaitools</category>
      <category>datascience</category>
      <category>agents</category>
    </item>
    <item>
      <title>mAIdAI: Building a Personal Assistant with Google Cloud and Vertex AI</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Thu, 05 Feb 2026 06:05:23 +0000</pubDate>
      <link>https://dev.to/fmind/maidai-building-a-personal-assistant-with-google-cloud-and-vertex-ai-aof</link>
      <guid>https://dev.to/fmind/maidai-building-a-personal-assistant-with-google-cloud-and-vertex-ai-aof</guid>
      <description>&lt;p&gt;As an AI Architect, I spend my days designing AI systems and agents for others. I optimize workflows, fine-tune context windows, and architect serverless solutions to solve complex business problems.&lt;/p&gt;

&lt;p&gt;But recently, I caught myself in a classic “cobbler’s children” scenario. While helpful bots supported my teams, I navigated my own workflow manually — answering the same repetitive questions, digging for the same documentation links, and context-switching constantly.&lt;/p&gt;

&lt;p&gt;I realized I needed something different. Not another generic team bot, but a &lt;strong&gt;Personal AI Assistant&lt;/strong&gt;  — one that knows &lt;em&gt;my&lt;/em&gt; specific context, &lt;em&gt;my&lt;/em&gt; preferred shortcuts, and &lt;em&gt;my&lt;/em&gt; tone.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;mAIdAI&lt;/strong&gt; (My AI Aid) &lt;strong&gt;:&lt;/strong&gt; &lt;a href="https://github.com/fmind/maidai" rel="noopener noreferrer"&gt;https://github.com/fmind/maidai&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.amazonaws.com%2Fuploads%2Farticles%2Ftywqba7ydv7ti0wyg496.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.amazonaws.com%2Fuploads%2Farticles%2Ftywqba7ydv7ti0wyg496.png" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;mAIdAI Avatar (Source: Gemini App)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk you through how I architected this personal agent using &lt;strong&gt;Google Chat&lt;/strong&gt; , &lt;strong&gt;Cloud Run&lt;/strong&gt; , and &lt;strong&gt;Vertex AI&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Problem: The High Cost of “Quick” Tasks
&lt;/h3&gt;

&lt;p&gt;We often underestimate the micro-friction in our daily work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Where is the design doc for Project X?”&lt;/li&gt;
&lt;li&gt;“What’s the syntax for that specific gcloud command again?”&lt;/li&gt;
&lt;li&gt;“Can you review this snippet?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Standard team bots are great, but they are generic. They lack the &lt;em&gt;specific&lt;/em&gt; context of your personal role and responsibilities. I wanted an agent that acts as a “Second Brain” — grounded in my personal knowledge and capable of executing my specific workflows.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Solution: mAIdAI Pattern
&lt;/h3&gt;

&lt;p&gt;mAIdAI is designed around three core interaction types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context-Aware Chat&lt;/strong&gt; : A conversational flow grounded in a personal context.md file effective “system instructions”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Commands&lt;/strong&gt; : Instant helpers that return static values (like commonly used links or snippets) without invoking the LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slash Commands&lt;/strong&gt; : specialized triggers that wrap user input in a predefined prompt template (e.g., /fix to debug code).&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fy5cbdazr0n8p645v7sos.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.amazonaws.com%2Fuploads%2Farticles%2Fy5cbdazr0n8p645v7sos.png" width="799" height="327"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Demo of mAIdAI on Google Chat (Generic Version)&lt;/em&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.amazonaws.com%2Fuploads%2Farticles%2Fbk4zrqnrzqkjbda1asmp.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.amazonaws.com%2Fuploads%2Farticles%2Fbk4zrqnrzqkjbda1asmp.png" width="800" height="415"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;About mAIdAI&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;The system follows a lightweight, serverless event-driven architecture.&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.amazonaws.com%2Fuploads%2Farticles%2Fm7u2ip9jhrtodreztal0.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.amazonaws.com%2Fuploads%2Farticles%2Fm7u2ip9jhrtodreztal0.png" width="799" height="259"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Architecture Diagram of mAIdAI (Source: Fmind.dev)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; : usage of the &lt;strong&gt;Google Chat&lt;/strong&gt; app interface. No custom UI to build or maintain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport&lt;/strong&gt; : Chat events are delivered via HTTP webhooks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt; : A &lt;strong&gt;Cloud Run&lt;/strong&gt; service hosting a FastAPI application processes the events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligence&lt;/strong&gt; : The backend connects to &lt;strong&gt;Vertex AI&lt;/strong&gt; (Gemini models) for reasoning, grounded by the personal context file.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Deep Dive: The Code
&lt;/h3&gt;

&lt;p&gt;The implementation is surprisingly minimal, thanks to the &lt;strong&gt;Google GenAI SDK&lt;/strong&gt; and &lt;strong&gt;FastAPI&lt;/strong&gt;. The entire core logic resides in a single main.py file.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Setup
&lt;/h3&gt;

&lt;p&gt;We initialize the GenAI client using standard environment variables. This keeps the code portable and secure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# main.py
client = genai.Client(
  project=os.environ["GOOGLE_CLOUD_PROJECT"],
  location=os.environ["GOOGLE_CLOUD_LOCATION"],
  vertexai=True,
)
# Loading the Second Brain
MODEL_CONTEXT = (ROOT_FOLDER / "context.md").read_text()
config = types.GenerateContentConfig(
  system_instruction=MODEL_CONTEXT,
  max_output_tokens=5000,
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By reading context.md at startup and injecting it as the system_instruction, we ensure every interaction is grounded in my specific reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Handling Interaction Types
&lt;/h3&gt;

&lt;p&gt;The core router handles the distinction between simple commands and AI interactions. This is crucial for latency and cost — not every interaction needs a round-trip to an LLM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.post("/")
async def index(request: Request) -&amp;gt; dict:
    event = await request.json()
    # ... extraction logic ...

    if command_id := app_command_metadata.get("appCommandId"):
        # Handle Slash and Quick Commands
        if command_type == "QUICK_COMMAND":
            return respond(command_text)

        if command_type == "SLASH_COMMAND":
            # Contextualize the prompt
            prompt = f"{command_text}. USER INPUT: {user_input}"
            return respond(await chat(prompt))

    # Fallback to standard chat
    return respond(await chat(user_input))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern allows me to have a /links command that returns immediately (0 latency, 0 cost), while a /rewrite command leverages Gemin 2.0 Flash for creative work.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Asynchrony by Default
&lt;/h3&gt;

&lt;p&gt;Using async def and client.aio.models.generate_content ensures the Cloud Run container can handle multiple concurrent requests efficiently, even with a single instance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment Strategy
&lt;/h3&gt;

&lt;p&gt;Simplicity was the primary constraint. I didn’t want to manage infrastructure for a personal tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt; : Cloud Run (fully managed, scales to zero, low-cost serving).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt; : Environment variables for model selection (gemini-3-flash) and project details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; : IAM-based authentication ensures only verified chat events reach the service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Build This Locally?
&lt;/h3&gt;

&lt;p&gt;You might ask, “Why not use a standard consumer AI chat?”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; : Data stays within my Google Cloud project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; : I control the system prompt (context.md) explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Integration&lt;/strong&gt; : It lives where I work — in Google Chat — not a separate browser tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;We often accept friction because “it’s just how things are.” But as engineers, we have the tools to change that. mAIdAI is a proof of concept that a highly personalized, context-aware agent doesn’t require a massive engineering team. It just requires a few hundred lines of Python and the right cloud primitives.&lt;/p&gt;

&lt;p&gt;If you find yourself copying the same text or answering the same questions repeatedly, maybe it’s time to build your own assistant.&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.amazonaws.com%2Fuploads%2Farticles%2Foq1uhgmbs22pfdbnnfx8.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.amazonaws.com%2Fuploads%2Farticles%2Foq1uhgmbs22pfdbnnfx8.png" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: Gemini App&lt;/em&gt;&lt;/p&gt;

</description>
      <category>artificialintelligen</category>
      <category>agents</category>
      <category>automation</category>
      <category>generativeaitools</category>
    </item>
    <item>
      <title>MLOps Coding Skills: Bridging the Gap Between Specs and Agents</title>
      <dc:creator>Médéric Hurier (Fmind)</dc:creator>
      <pubDate>Wed, 28 Jan 2026 20:50:20 +0000</pubDate>
      <link>https://dev.to/fmind/mlops-coding-skills-bridging-the-gap-between-specs-and-agents-3mn1</link>
      <guid>https://dev.to/fmind/mlops-coding-skills-bridging-the-gap-between-specs-and-agents-3mn1</guid>
      <description>&lt;p&gt;We are entering the golden age of AI Coding. Every day, I see colleagues, both technical and non-technical, marveling at how agents are rewriting the rules of software construction. The promise is intoxicating: describe what you want, and let the machine handle the rest.&lt;/p&gt;

&lt;p&gt;However, when I see my colleagues try to apply these agents to strict engineering standards, they hit a wall. On one side, you have rigorous specification tools like &lt;a href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;spec-kit&lt;/a&gt; or &lt;a href="https://github.com/gemini-cli-extensions/conductor" rel="noopener noreferrer"&gt;conductor&lt;/a&gt;. They are deterministic and thorough, but setting them up feels like writing a legal contract. On the other side, you have generic tools like the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;. They act as incredible “hands” for the AI — reading databases, calling APIs — but they lack the &lt;em&gt;brain&lt;/em&gt; for your specific context.&lt;/p&gt;

&lt;p&gt;They don’t know that your team enforces &lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;uv&lt;/a&gt; over &lt;a href="https://python-poetry.org/" rel="noopener noreferrer"&gt;poetry&lt;/a&gt;. They don’t know you prefer &lt;a href="https://github.com/casey/just" rel="noopener noreferrer"&gt;just&lt;/a&gt; files for automation. They don’t know your specific flavor of “clean code.”&lt;/p&gt;

&lt;p&gt;Then I discovered &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;&lt;strong&gt;Agent Skills&lt;/strong&gt;&lt;/a&gt;, and everything clicked.&lt;/p&gt;

&lt;p&gt;I was immediately hooked. They offer the specific trade-off I had been looking for: &lt;strong&gt;lightweight enough to be flexible, yet opinionated enough to be useful.&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fkftm0o55pylc68t9olr9.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.amazonaws.com%2Fuploads%2Farticles%2Fkftm0o55pylc68t9olr9.png" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: Gemini App&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this article, I want to share how I used Agent Skills to turn the theoretical “MLOps Coding Course” into a practical, actionable library: the &lt;a href="https://github.com/MLOps-Courses/mlops-coding-skills" rel="noopener noreferrer"&gt;&lt;strong&gt;MLOps Coding Skills&lt;/strong&gt;&lt;/a&gt; project.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Challenge: Making References Actionable
&lt;/h3&gt;

&lt;p&gt;For the past few months, I’ve been deep in the trenches writing the &lt;a href="https://github.com/MLOps-Courses/mlops-coding-course" rel="noopener noreferrer"&gt;&lt;strong&gt;MLOps Coding Course&lt;/strong&gt;&lt;/a&gt;. It is a comprehensive curriculum teaching production-grade MLOps, from robust project initialization to advanced observability.&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.amazonaws.com%2Fuploads%2Farticles%2Fi5cl3a3v5sjdawaylla4.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.amazonaws.com%2Fuploads%2Farticles%2Fi5cl3a3v5sjdawaylla4.png" width="800" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But as I wrote the documentation, I felt a friction point. Learning the standards is one thing; remembering to apply them in the heat of coding is another.&lt;/p&gt;

&lt;p&gt;I didn’t just want another wiki page. I wanted to make these best practices &lt;strong&gt;actionable&lt;/strong&gt; for valid AI Agents. I wanted to move from “reading the docs” to “installing the capability.”&lt;/p&gt;
&lt;h3&gt;
  
  
  The Logic: How to “Skillify” Knowledge
&lt;/h3&gt;

&lt;p&gt;The beauty of an Agent Skill lies in its simplicity. It is essentially a markdown file (SKILL.md) that functions as a context injection module. It gives the agent “muscle memory” for a specific topic.&lt;/p&gt;

&lt;p&gt;My methodology for building the &lt;strong&gt;MLOps Coding Skills&lt;/strong&gt; repo was straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Isolate a Chapter&lt;/strong&gt; : Take a specific section of the course (e.g., &lt;em&gt;Automation&lt;/em&gt; or &lt;em&gt;Observability&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract Patterns&lt;/strong&gt; : Use an LLM to distill the generic engineering standards from the educational content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardize&lt;/strong&gt; : Format it into a SKILL.md that an agent can ingest.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  A Concrete Example: Automating Ops
&lt;/h3&gt;

&lt;p&gt;Let’s look at the &lt;a href="https://github.com/MLOps-Courses/mlops-coding-skills/tree/main/mlops-automation" rel="noopener noreferrer"&gt;&lt;strong&gt;mlops-automation&lt;/strong&gt;&lt;/a&gt; skill.&lt;/p&gt;

&lt;p&gt;In our course, we have strong opinions: we use just for command running and &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;docker&lt;/a&gt; for containerization, with very specific layer caching strategies.&lt;/p&gt;

&lt;p&gt;Here is what the skill looks like “on the wire”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# MLOps Automation

## Goal

To elevate the codebase to production standards by adding Task Automation (just), Containerization ([docker](https://www.docker.com/)), CI/CD ([github-actions](https://github.com/features/actions)), and Experiment Tracking ([mlflow](https://mlflow.org/)).

## Instructions

### 1. Task Automation

Replace manual commands with a `justfile`.
1. **Tool** : `just` (modern alternative to Make).
2. **Organization** : Split tasks into `tasks/*.just` modules.
3. **Core Tasks** :
- `check`: Run all linters and tests.
- `package`: Build wheels.

### 2. Containerization

1. **Tool** : `docker`.
2. **Base Image** : Use `ghcr.io/astral-sh/uv:python3.1X-bookworm-slim` for minimal size.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I load this skill, my agent stops guessing. It doesn’t offer me a Makefile. It doesn’t suggest a bloated Ubuntu image. It acts like a senior engineer who has been on the team for years.&lt;/p&gt;

&lt;h3&gt;
  
  
  The “Senior Engineer” Injection
&lt;/h3&gt;

&lt;p&gt;This is the killer value proposition.&lt;/p&gt;

&lt;p&gt;Most frustrations with AI coding come from a &lt;strong&gt;lack of context&lt;/strong&gt;. We blame the model for being “dumb,” but usually, we just haven’t told it the rules of the house.&lt;/p&gt;

&lt;p&gt;By using Agent Skills, you are effectively &lt;strong&gt;injecting a Senior Engineer into your chat context&lt;/strong&gt;. You are giving the agent a “cheat sheet” that forces it to align with your organization’s reality.&lt;/p&gt;

&lt;p&gt;I now use these skills for every new project I touch. I don’t spend an hour setting up boilerplate. I load or create a skill, and within minutes, I had a structure that matched my most rigorous standards.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Friction Points
&lt;/h3&gt;

&lt;p&gt;Of course, no solution is perfect. There are still rough edges in this workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-First Friction&lt;/strong&gt; : Currently, skills often sit in a local .agent/skills folder. It works, but copying them around feels archaic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Context Stack&lt;/strong&gt; : We are seeing a fragmentation of context. We have MCP servers for tools, AGENTS.md for persona, and Skills for tasks. Managing this “Context Stack” is becoming a new engineering discipline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration gaps&lt;/strong&gt; : I love how the &lt;strong&gt;Gemini CLI&lt;/strong&gt; handles this via extensions, but I’m eager to see this standardized across VS Code Copilot, Cursor, and other IDEs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Despite the minor friction, Agent Skills are excellent “Low Hanging Fruit” for any engineering team.&lt;/p&gt;

&lt;p&gt;The productivity gain is massive. For a few minutes of setup — writing a markdown file — you save hours of correcting boilerplate code and enforcing standards down the line. It bridges the gap between the &lt;strong&gt;rigidity of a spec&lt;/strong&gt; and the &lt;strong&gt;chaos of a raw LLM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are tired of fighting your AI to follow your style, stop arguing with it. Give it a Skill.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Check out the full&lt;/em&gt; &lt;a href="https://github.com/MLOps-Courses/mlops-coding-skills" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;MLOps Coding Skills repository&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;to see the library in action.&lt;/em&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.amazonaws.com%2Fuploads%2Farticles%2Fok377lni28spe4zzw2dn.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.amazonaws.com%2Fuploads%2Farticles%2Fok377lni28spe4zzw2dn.png" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: Gemini App&lt;/em&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>coding</category>
      <category>generativeaitools</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
