<?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: Bilgin Ibryam</title>
    <description>The latest articles on DEV Community by Bilgin Ibryam (@bibryam).</description>
    <link>https://dev.to/bibryam</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%2F356015%2F43b8716c-0f2a-4249-ba50-acff6d29e008.jpg</url>
      <title>DEV Community: Bilgin Ibryam</title>
      <link>https://dev.to/bibryam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bibryam"/>
    <language>en</language>
    <item>
      <title>Latency Patterns for Faster AI Applications</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Sat, 29 Aug 2026 20:16:40 +0000</pubDate>
      <link>https://dev.to/bibryam/latency-patterns-for-faster-ai-applications-369m</link>
      <guid>https://dev.to/bibryam/latency-patterns-for-faster-ai-applications-369m</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical map for shortening the path from user intent to a useful AI response.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you type a question into ChatGPT, latency is the time until the first useful response appears. The same applies when you click on a dashboard and wait for the first useful chart. That interval may include browser work, authentication, an API gateway, application logic, database queries, an LLM call, and the final rendering. The user waits for all the required work on this critical path, not only for one isolated component.&lt;/p&gt;

&lt;p&gt;This is why a fast database query or LLM call does not prove that the application is fast. We need to measure the full path as a distribution and identify what controls the percentile we care about. Once we know what dominates the critical path, we can bring requests and data closer, reduce work, execute independent work concurrently, or anticipate predictable work. These are general distributed-system patterns that apply equally to AI applications. The map below adapts latency optimization ideas from Pekka Enberg’s &lt;a href="https://link.amazon/B0emb7Jbb" rel="noopener noreferrer"&gt;&lt;em&gt;Latency book&lt;/em&gt;&lt;/a&gt; into four practical pattern categories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw810mx4nknbr5xvrcczo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw810mx4nknbr5xvrcczo.png" alt="Four categories of latency patterns" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An agentic request may cross RAG retrieval, databases, a model gateway, one or more LLMs, MCP or other tool servers, and an orchestration loop. A large part of the latency often comes from the LLM calls, but the model is still only one segment of the path. Model-serving optimizations include quantization, decoding, and server scheduling. I cover those in &lt;a href="https://www.youtube.com/watch?v=tLK5jyhQOgA" rel="noopener noreferrer"&gt;this talk&lt;/a&gt; and &lt;a href="https://generativeprogrammer.com/p/applying-kubernetes-patterns-to-llm?utm_source=publication-search" rel="noopener noreferrer"&gt;this&lt;/a&gt; post. In this post, I explicitly focus on &lt;strong&gt;non-model latencies&lt;/strong&gt; across the application path.&lt;/p&gt;

&lt;p&gt;Each category explains the patterns through traditional application examples, then compares how they apply in an AI application. Taken together, I see 19 latency patterns across four categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Locality Patterns
&lt;/h2&gt;

&lt;p&gt;The first thing to check is whether the request and the data it needs are far apart. That distance may be geographical, between services, between processes on one host, or even between a CPU core and memory. There are four common patterns for shortening this part of the path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg94fx8o0vmygnmrivd29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg94fx8o0vmygnmrivd29.png" alt="Locality patterns: colocation, replication, partitioning, and caching" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Colocation Pattern
&lt;/h3&gt;

&lt;p&gt;Colocation shortens or removes a boundary between the source and the target. The scale can vary significantly. A CDN can serve the dashboard shell closer to the user. Application logic can run in the same region as its database instead of crossing a wide-area network. On one host, CPU affinity and NUMA-aware placement can keep hot work and memory near the cores that use them. The mechanism is the same even when the distances are very different.&lt;/p&gt;

&lt;p&gt;When to use. Use colocation when the distance between components that frequently interact is a measurable part of the critical path.&lt;/p&gt;

&lt;p&gt;The main trade-off. Tighter placement can reduce scheduling flexibility and make failover or scaling across locations more difficult.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Replication Pattern
&lt;/h3&gt;

&lt;p&gt;Replication places a readable copy in more than one location. A nearby replica can shorten the read path, but only when the application is allowed to read from it. For example, a dashboard can read tenant data from the nearest regional replica instead of crossing regions for every query.&lt;/p&gt;

&lt;p&gt;When to use. Use replication for read-heavy paths that can tolerate a clearly defined level of staleness.&lt;/p&gt;

&lt;p&gt;The main trade-off. Synchronous replication may keep the write waiting for required acknowledgements, while asynchronous replication can respond earlier but allow lag. The application must decide which reads can tolerate older data, how they are routed, and what should happen during a failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Partitioning Pattern
&lt;/h3&gt;

&lt;p&gt;Partitioning divides data or work into units that can be placed and processed independently. It does not make anything closer by itself, but a good partition key can keep a tenant’s query and data together. For example, a dashboard can partition metrics by tenant so that most queries touch one shard rather than several.&lt;/p&gt;

&lt;p&gt;When to use. Use partitioning when requests and data share a stable key that can keep related work within one partition or location.&lt;/p&gt;

&lt;p&gt;The main trade-off. A poor key can create a hot partition, while a request that spans several partitions brings routing and coordination back onto the critical path.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Caching Pattern
&lt;/h3&gt;

&lt;p&gt;Caching creates a shortcut for repeated reads or computation. The hit ratio tells us how often the shortcut works, while the miss penalty tells us how painful the original path remains. For example, a dashboard can cache common aggregates close to the application instead of recalculating them for every page load.&lt;/p&gt;

&lt;p&gt;When to use. Use caching when reads or computations repeat and their results can be safely reused.&lt;/p&gt;

&lt;p&gt;The main trade-off. A high hit ratio can still produce a bad tail when misses are expensive. Freshness, invalidation, and ownership determine whether the cached result can be trusted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing What to Bring Closer
&lt;/h3&gt;

&lt;p&gt;In a traditional application, start with the kind of distance that creates the delay. Use colocation when two components communicate frequently, replication when reads are far from the source, partitioning when related data can be kept together, and caching when the same data or computation is requested repeatedly. The patterns can be combined, but each addresses a different reason for travelling across the system.&lt;/p&gt;

&lt;p&gt;In an AI application, apply the same test to the orchestrator, model gateway, retrieval store, state store, and tools. Colocate dependencies that communicate frequently, replicate read-heavy knowledge where residency rules allow it, partition state by tenant or session, and cache repeated retrieval, schema discovery, session summarization, policy lookup, or model prefill work. Cache keys must include every input that can change the meaning of a result, including tenant and authorization scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work Reduction Patterns
&lt;/h2&gt;

&lt;p&gt;If the latency trace points at computation as the bottleneck, the next move is to remove work. Work that no longer exists cannot delay the request, consume capacity, or create another failure point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwg0le1pa90faiq4m3mh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwg0le1pa90faiq4m3mh.png" alt="Work reduction patterns for shortening the critical path" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Algorithmic Work Reduction Pattern
&lt;/h3&gt;

&lt;p&gt;An index over tenant and time can replace a full scan. A hash lookup can replace a linear search. Filtering before an expensive join or sort can reduce the dataset before the costly operation begins. These changes reduce the amount of work rather than making the same work slightly faster.&lt;/p&gt;

&lt;p&gt;When to use. Use this pattern when query or computation cost dominates and a better algorithm, index, or data structure can reduce the work.&lt;/p&gt;

&lt;p&gt;The main trade-off. A faster access path may require additional indexes, memory, preprocessing, or implementation complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Selective Data Processing Pattern
&lt;/h3&gt;

&lt;p&gt;A dashboard does not need the full object graph when the first chart uses five fields. Building large intermediate objects, copying them between layers, serializing them, and then discarding most of the result consumes time without changing what the user sees. A lean response should carry only what the next step needs.&lt;/p&gt;

&lt;p&gt;When to use. Use selective data processing when the next step needs only a subset of the available data.&lt;/p&gt;

&lt;p&gt;The main trade-off. Removing too much data can trigger another request or prevent a later step from completing.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Setup Reuse Pattern
&lt;/h3&gt;

&lt;p&gt;Reusing an established connection, a parsed schema, or validated orchestration state avoids repeating the same setup on every request.&lt;/p&gt;

&lt;p&gt;When to use. Use setup reuse when the same initialization cost is paid repeatedly and the resulting state can be retained safely.&lt;/p&gt;

&lt;p&gt;The main trade-off. Reused state needs explicit lifecycle, freshness, isolation, and failure handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Request Coalescing Pattern
&lt;/h3&gt;

&lt;p&gt;Combining several known reads into one request can remove repeated serialization, scheduling, and round trips. This is where request batching can help latency. For example, a dashboard backend can fetch the summary, alerts, and recent events in one call instead of making three sequential requests.&lt;/p&gt;

&lt;p&gt;When to use. Use request coalescing when several predictable calls cross the same boundary and can be safely combined.&lt;/p&gt;

&lt;p&gt;The main trade-off. A combined request can make one slow operation hold back all the others. It should be measured against the user-visible latency target, not assumed to be faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Runtime Tuning Pattern
&lt;/h3&gt;

&lt;p&gt;Allocation, garbage collection, demand paging, scheduling, and context switches can all delay useful work. Profile the critical path first, then reduce only the runtime costs that measurably affect it. For example, a service may reduce short-lived allocations or tune its heap after profiles tie p99 spikes to garbage-collection pauses. These costs are measurable suspects, not default explanations for every slow service.&lt;/p&gt;

&lt;p&gt;When to use. Use runtime tuning when profiles show that runtime overhead affects the percentile you are trying to improve.&lt;/p&gt;

&lt;p&gt;The main trade-off. Runtime tuning can increase implementation complexity and may depend on a specific runtime, operating system, or hardware configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing What Work to Remove
&lt;/h3&gt;

&lt;p&gt;In a traditional application, first identify what kind of work dominates the trace. Algorithmic work reduction changes how the result is found. Selective data processing reduces how much data moves through the path. Setup reuse avoids repeating initialization, while request coalescing removes repeated boundary crossings. Runtime tuning comes last because it is useful only when profiles point to the runtime itself.&lt;/p&gt;

&lt;p&gt;In an AI application, remove model and tool calls before optimizing them. Use deterministic code or indexed search for direct lookup, filter and rank evidence before it enters the prompt, reuse model and tool connections where safe, and combine calls that always happen together. Route simple tasks to a smaller model when it meets the same quality target, stop generation when the useful answer is complete, and bound tool output before it becomes prompt input. Smaller prompts help only when they remain sufficient. If missing context causes another retrieval and model turn, the end-to-end path may become longer.&lt;/p&gt;

&lt;p&gt;Once the remaining work is necessary, the next question is whether it really has to run in sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concurrent Execution Patterns
&lt;/h2&gt;

&lt;p&gt;Some work is necessary but does not need to happen in sequence. Suppose authentication must finish first, but four dashboard panels are then independent. Running them serially makes the user wait for roughly the sum of their durations. Starting them together can bring the wait closer to the slowest required panel, plus scheduling and coordination overhead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6oi5eshynhtrffbko78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6oi5eshynhtrffbko78.png" alt="Concurrent execution patterns for overlapping independent work" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Synchronization Avoidance Pattern
&lt;/h3&gt;

&lt;p&gt;A contended lock can make otherwise short operations line up behind one owner. Immutable state may remove the shared dependency, while a single-owner design may replace lock contention with an explicit queue. The important question is whether another operation must finish or release something before this one can continue.&lt;/p&gt;

&lt;p&gt;When to use. Use synchronization avoidance when coordination over shared state is a measurable source of waiting and the state can be made immutable, partitioned, or owned by one component.&lt;/p&gt;

&lt;p&gt;The main trade-off. Removing a lock may move the waiting elsewhere or require a different state-management model.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Independent Concurrency Pattern
&lt;/h3&gt;

&lt;p&gt;Concurrency lets several tasks make progress, while parallelism executes work at the same time. For the dashboard, separate panel reads can run concurrently. In an agentic application, a research agent can query independent document stores and market-data sources in parallel, then join the results before synthesis. If one tool needs an identifier returned by another, that dependency remains serial.&lt;/p&gt;

&lt;p&gt;When to use. Use independent concurrency when required tasks have no data dependency and the system has enough capacity to run them together.&lt;/p&gt;

&lt;p&gt;The main trade-off. Concurrency does not help when one task genuinely needs the result of another, and it can make latency worse when the fan-out exhausts a shared dependency.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Progressive Response Pattern
&lt;/h3&gt;

&lt;p&gt;An event loop can use resources more efficiently while external I/O is pending, but it does not make the database, model, or remote service intrinsically faster. The visible latency improves when an AI application streams useful model output or an independently useful tool result instead of holding everything until the full task completes.&lt;/p&gt;

&lt;p&gt;When to use. Use a progressive response when a partial result is independently useful and time to first useful result matters to the user.&lt;/p&gt;

&lt;p&gt;The main trade-off. This pattern shortens time to first useful result, not full completion, and the client must handle partial or provisional state.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. Concurrency Budget Pattern
&lt;/h3&gt;

&lt;p&gt;A queue stores waiting; it does not remove it. If arrivals exceed capacity, the queue grows and tail latency follows. Set a concurrency budget, propagate deadlines and cancellation, apply backpressure, and stop work when the user no longer needs it. For example, a dashboard can allow only four panel queries to run at once rather than sending an unbounded fan-out to the database.&lt;/p&gt;

&lt;p&gt;When to use. Use a concurrency budget when one request can fan out across services, databases, models, or tools and overload a shared dependency.&lt;/p&gt;

&lt;p&gt;The main trade-off. A budget that is too low leaves capacity unused, while one that is too high moves the queue into a downstream dependency.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Hedged Requests Pattern
&lt;/h3&gt;

&lt;p&gt;Request hedging reduces exposure to a straggler by sending equivalent copies and accepting the first valid response. For example, after a short delay, a service can send the same read to a second replica and use whichever valid response arrives first.&lt;/p&gt;

&lt;p&gt;When to use. Use hedged requests when rare stragglers dominate tail latency, spare capacity exists, and the operation is idempotent or side-effect-free.&lt;/p&gt;

&lt;p&gt;The main trade-off. Hedging spends extra capacity and can worsen overload if it is used without a strict budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing What Can Run Together
&lt;/h3&gt;

&lt;p&gt;In a traditional application, synchronization avoidance removes unnecessary waiting, while independent concurrency overlaps work that has no dependency. A progressive response changes when useful output becomes visible, not how fast the full operation completes. A concurrency budget protects shared capacity, while hedged requests spend additional capacity to reduce exposure to rare stragglers.&lt;/p&gt;

&lt;p&gt;In an AI application, use concurrency for independent model, tool, and retrieval calls, but keep dependent calls serial. A progressive response is a separate delivery decision: it changes when useful output becomes visible, not which tools can run in parallel. Apply one concurrency budget across models, subagents, tools, and retrieval, and hedge only side-effect-free or idempotent operations. The goal is a shorter dependency chain, not the largest possible fan-out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anticipation Patterns
&lt;/h2&gt;

&lt;p&gt;If a remaining delay cannot be removed or safely overlapped after the request arrives, we can anticipate likely work and move it earlier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgym1139u4gela2fwi9a1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgym1139u4gela2fwi9a1.png" alt="Anticipation patterns for moving predictable work earlier" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Predictive Prefetching Pattern
&lt;/h3&gt;

&lt;p&gt;Once authentication identifies the user, the application may fetch the default dashboard before the browser asks for its first panel. This is a prediction about a future read.&lt;/p&gt;

&lt;p&gt;When to use. Use predictive prefetching when the next read is predictable enough to justify occasionally wasted work.&lt;/p&gt;

&lt;p&gt;The main trade-off. Prefetching helps only when the data arrives in time and is still useful when the application needs it. A wrong prediction consumes resources without shortening the request.&lt;/p&gt;

&lt;h3&gt;
  
  
  16. Optimistic Update Pattern
&lt;/h3&gt;

&lt;p&gt;A filter can appear selected while persistence continues, as long as the interface shows that the change is pending and can roll it back after a failure. This improves perceived latency after the user acts. It does not make durable completion happen earlier.&lt;/p&gt;

&lt;p&gt;When to use. Use optimistic updates when success is common, failure is visible, and the operation can be safely reversed.&lt;/p&gt;

&lt;p&gt;The main trade-off. A failed operation requires rollback, and provisional state must never be presented as completed work.&lt;/p&gt;

&lt;h3&gt;
  
  
  17. Speculative Execution Pattern
&lt;/h3&gt;

&lt;p&gt;Speculative execution runs a likely branch before the actual choice arrives. For example, a dashboard can start calculating the most common time range while the user is still opening the time-range filter.&lt;/p&gt;

&lt;p&gt;When to use. Use speculative execution when a small number of likely branches can run safely, independently, and be cancelled.&lt;/p&gt;

&lt;p&gt;The main trade-off. The work must be isolated and cancellable because a wrong prediction consumes resources without helping the request.&lt;/p&gt;

&lt;h3&gt;
  
  
  18. Precomputation Pattern
&lt;/h3&gt;

&lt;p&gt;Maintaining a tenant aggregate as events arrive can replace repeated foreground computation with a read. Precomputation moves known work from the foreground request to the point where the source data changes.&lt;/p&gt;

&lt;p&gt;When to use. Use precomputation when an expensive result can be refreshed as its source changes rather than calculated for every request.&lt;/p&gt;

&lt;p&gt;The main trade-off. Precomputed results consume storage and refresh capacity, and they may be stale when the source changes faster than they can be updated.&lt;/p&gt;

&lt;h3&gt;
  
  
  19. Prewarming Pattern
&lt;/h3&gt;

&lt;p&gt;A small worker pool, connection pool, or execution environment can be initialized before traffic arrives. Prewarming moves predictable setup cost off the foreground critical path.&lt;/p&gt;

&lt;p&gt;When to use. Use prewarming when cold-start or setup cost is predictable and keeping limited capacity ready is affordable.&lt;/p&gt;

&lt;p&gt;The main trade-off. Warm resources consume capacity even when no request uses them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing What to Do Earlier
&lt;/h3&gt;

&lt;p&gt;In a traditional application, predictive prefetching prepares a likely read, optimistic updates show likely success before durable completion, and speculative execution starts a likely branch. Precomputation prepares reusable results when source data changes, while prewarming prepares resources before requests arrive. The difference is what is moved earlier: data, feedback, a branch, a result, or capacity.&lt;/p&gt;

&lt;p&gt;In an AI application, prefetch likely context once intent is known, run safe read-only searches for likely branches, precompute embeddings, indexes, summaries, and policy metadata, and prewarm agent workers or model and tool connections. An optimistic interface may show a tool action as pending before it commits, but never as completed.&lt;/p&gt;

&lt;p&gt;For all of these patterns, track whether the early work was used, whether it completed in time, how much critical-path time it saved, how much work was discarded, and whether optimistic state had to roll back. Cancel early work when it is no longer useful. A prediction that delays normal traffic is not an optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the Bottleneck, Choose the Pattern
&lt;/h2&gt;

&lt;p&gt;Do not start by choosing a pattern. Start by tracing the full request and locating where delay enters the critical path: context retrieval, model access, tools, agent coordination, or verification and delivery.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcinylofi2pav34oaqkes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcinylofi2pav34oaqkes.png" alt="AI application latency matrix mapping four pattern categories across the request path" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the matrix in two moves. First, choose the column where the delay appears. Then move down that column and select the intervention that matches its cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Locality Patterns:&lt;/strong&gt; The request, data, or dependency is too far away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work Reduction Patterns:&lt;/strong&gt; The application performs unnecessary computation, data processing, or calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent Execution Patterns:&lt;/strong&gt; Independent work is waiting in sequence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anticipation Patterns:&lt;/strong&gt; Predictable work remains on the foreground path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cells are starting points, not a checklist. Pick the smallest pattern that changes the dominant part of the path. Before applying it, check whether it will amplify the tail or trade away quality, freshness, privacy, cost, or correctness. Then measure the same latency clock at the target percentile together with task success. If the bottleneck moves, return to the matrix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;p&gt;The following resources cover the three ideas behind this catalogue: measuring the AI application path, understanding tail latency, and diagnosing system-level bottlenecks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measuring the AI application path&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenTelemetry, &lt;a href="https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/README.md" rel="noopener noreferrer"&gt;&lt;em&gt;Generative AI semantic conventions&lt;/em&gt;&lt;/a&gt;: shared spans, metrics, and events for models, agents, and MCP.&lt;/li&gt;
&lt;li&gt;NVIDIA, &lt;a href="https://docs.nvidia.com/nim/benchmarking/llm/latest/metrics.html" rel="noopener noreferrer"&gt;&lt;em&gt;LLM inference metrics&lt;/em&gt;&lt;/a&gt;: definitions of time to first token, end-to-end request latency, inter-token latency, and throughput.&lt;/li&gt;
&lt;li&gt;Gil Tene, &lt;a href="https://www.infoq.com/presentations/latency-pitfalls/" rel="noopener noreferrer"&gt;&lt;em&gt;How NOT to Measure Latency&lt;/em&gt;&lt;/a&gt;: coordinated omission and other measurement errors that can hide real latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fan-out and tail latency&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jeffrey Dean and Luiz André Barroso, &lt;a href="https://research.google/pubs/the-tail-at-scale/" rel="noopener noreferrer"&gt;&lt;em&gt;The Tail at Scale&lt;/em&gt;&lt;/a&gt;: why rare stragglers become common as requests fan out.&lt;/li&gt;
&lt;li&gt;Marc Brooker, &lt;a href="https://brooker.co.za/blog/2021/10/20/simulation.html" rel="noopener noreferrer"&gt;&lt;em&gt;Serial, Parallel, and Quorum Latencies&lt;/em&gt;&lt;/a&gt;: a simulator for understanding how latency composes across dependent and parallel work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;System-level diagnosis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pekka Enberg, &lt;a href="https://www.amazon.co.uk/Latency-Reduce-Delay-Software-Systems/dp/1633438082?dib=eyJ2IjoiMSJ9.ja7DFHRfNuSG-3_P2Lfm9kswVPnHY1qn91gD4G0VTccOYPhETq4acRf6-FnBnoJLpDFy19_7MDjaRlWAl5fOEtoP0iTkvohFHlGtIMKIo5imm_ES1qYU45BNrYZLCZgPb6YQMoKzVUcpQdUDL_RIbzFy4az2RAPCD3stIK1rjg05NJGyy1sbuZqO4P53AtPKLr3TzXtyBoGq-vAxmdIhpTwnTq7UYTQVBuNHC_OGAR4.87pV3uDeCUDDX9U6FJzzjLPxBd29Mn8gNm8Yx78nOa8&amp;amp;dib_tag=se&amp;amp;keywords=Latency&amp;amp;qid=1787783499&amp;amp;sr=8-1&amp;amp;ufe=app_do%3Aamzn1.fos.95fd378e-6299-4723-b1f1-3952ffba15af&amp;amp;linkCode=sl2&amp;amp;tag=ofbizian-21&amp;amp;linkId=0636c8264adb99c7c922a6c838a04105&amp;amp;ref_=as_li_ss_tl&amp;amp;ascsubtag=srctok-63156b7886032f2a&amp;amp;btn_type=ss&amp;amp;btn_ref=srctok-63156b7886032f2a" rel="noopener noreferrer"&gt;Latency&lt;/a&gt;: Reduce Delay in Software Systems (highly recommended read and the inspiration for this post)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alexey Ivanov, &lt;a href="https://dropbox.tech/infrastructure/optimizing-web-servers-for-high-throughput-and-low-latency" rel="noopener noreferrer"&gt;&lt;em&gt;Optimizing web servers for high throughput and low latency&lt;/em&gt;&lt;/a&gt;: a production case study from hardware and NUMA to the kernel and application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Brendan Gregg, &lt;a href="https://www.brendangregg.com/systems-performance-2nd-edition-book.html" rel="noopener noreferrer"&gt;&lt;em&gt;Systems Performance: Enterprise and the Cloud, Second Edition&lt;/em&gt;&lt;/a&gt;: a methodology for finding latency outliers across the full stack.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>performance</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Emerging Markdown Formats That Shape Coding Agent Behavior</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Sun, 16 Aug 2026 19:40:13 +0000</pubDate>
      <link>https://dev.to/bibryam/emerging-markdown-formats-that-shape-coding-agent-behavior-18bi</link>
      <guid>https://dev.to/bibryam/emerging-markdown-formats-that-shape-coding-agent-behavior-18bi</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical map of the rules, procedures, plans, domain knowledge, and memory that guide agent-assisted software changes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For years, the knowledge required to change software lived in many places. Non-functional requirements (NFRs), architectural constraints, and design decisions were captured in solution architecture documents, ADRs, security reviews, and wikis. Product intent lived in design documents and mockups. Work was broken down into tickets. Operational lessons survived in incident reports, Slack threads, playbooks, and the heads of experienced developers.&lt;/p&gt;

&lt;p&gt;The repository contained the implementation: source code, tests, configuration, and dependency manifests. Developers read across the surrounding artifacts, reconciled the desired outcome with architectural judgment, and translated both into code.&lt;/p&gt;

&lt;p&gt;As AI-assisted coding becomes normal, the repository is becoming the meeting point between that project knowledge and the agent changing the software. A monorepo brings codebases and their dependency graph together. An agent-ready repository also brings in the knowledge required to change them correctly.&lt;/p&gt;

&lt;p&gt;Software has always been understood through different lenses: principles and NFRs, architecture and design, concrete specifications, implementation plans, domain rules, and lessons learned during operation. A growing family of Markdown files now captures these dimensions in forms that coding agents can discover and use. This article looks at the formats and tools that are emerging. Together, they let an agent act as an intent compiler, translating human intent and judgment into source code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndw575sjnhnnij9xn6b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndw575sjnhnnij9xn6b3.png" alt="Project knowledge moves from scattered systems into an agent-ready repository guided by Markdown formats" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent onboarding starts with a README for agents
&lt;/h2&gt;

&lt;p&gt;A human onboards to a project once. An agent effectively onboards every time it starts a task. It needs to orient itself in the repository, discover the relevant commands and conventions, and understand the rules that apply before it changes anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; is the closest thing to a neutral standard for this purpose. The project describes it as a README for agents. A root file can explain the repository structure, build commands, tests, coding conventions, and pull request expectations. Nested files can add instructions for a package or subsystem. The format deliberately has no required fields.&lt;/p&gt;

&lt;p&gt;The ecosystem also has vendor-native alternatives that serve the same purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; provides cross-tool project guidance for Codex, Cursor, Cline, Copilot, OpenCode, and other compatible agents.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;.claude/rules/&lt;/code&gt;&lt;/a&gt; provide standing and path-scoped guidance for Claude Code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://geminicli.com/docs/cli/gemini-md/" rel="noopener noreferrer"&gt;&lt;code&gt;GEMINI.md&lt;/code&gt;&lt;/a&gt; provides hierarchical context for Gemini CLI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/add-custom-instructions/add-repository-instructions" rel="noopener noreferrer"&gt;&lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; and path-specific instruction files&lt;/a&gt; guide GitHub Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.cline.bot/customization/cline-rules" rel="noopener noreferrer"&gt;&lt;code&gt;.clinerules/&lt;/code&gt;&lt;/a&gt; carries persistent and conditional rules for Cline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use &lt;code&gt;pnpm&lt;/code&gt;, not &lt;code&gt;npm&lt;/code&gt;. Do not edit generated clients. Run the billing integration tests after changing an invoice flow. Read the relevant ADR before moving a service boundary. These are standing instructions that should remain true across many tasks.&lt;/p&gt;

&lt;p&gt;Once the agent understands the repository, the next question is how to perform a particular kind of work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills package repeatable procedures
&lt;/h2&gt;

&lt;p&gt;A skill is a playbook tailored to a particular kind of work.&lt;/p&gt;

&lt;p&gt;Consider a database migration. &lt;code&gt;AGENTS.md&lt;/code&gt; might state that every schema change needs a rollback path. A migration skill can describe the complete procedure: inspect the current schema, create the migration, update generated types, run compatibility checks, verify the rollback, and prepare the review summary.&lt;/p&gt;

&lt;p&gt;The open &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt; gives that playbook a portable package. Each skill has a required &lt;code&gt;SKILL.md&lt;/code&gt; containing metadata and instructions. It may also include scripts, references, templates, and other assets. Agents initially see the metadata, load the full instructions when the skill is relevant, then access supporting material as needed.&lt;/p&gt;

&lt;p&gt;Agent Skills &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;originated at Anthropic&lt;/a&gt; and were released as an open standard. They are separate from MCP, which Anthropic contributed to the &lt;a href="https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation" rel="noopener noreferrer"&gt;Agentic AI Foundation&lt;/a&gt;. The skill format is now documented by &lt;a href="https://developers.openai.com/codex/skills/" rel="noopener noreferrer"&gt;Codex&lt;/a&gt;, &lt;a href="https://geminicli.com/docs/cli/creating-skills/" rel="noopener noreferrer"&gt;Gemini CLI&lt;/a&gt;, &lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/add-skills" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;, and other compatible clients.&lt;/p&gt;

&lt;p&gt;The boundary is concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; and native rule files describe standing context and constraints.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SKILL.md&lt;/code&gt; describes a repeatable procedure invoked for a specific task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A procedure explains how to work. It still needs a reviewed description of what should be built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning files make software design reviewable
&lt;/h2&gt;

&lt;p&gt;Software design, planning, and task breakdown are also moving into versioned Markdown. When they exist only in chat, they disappear into session history. When they become repository artifacts, architects and developers can review them before an agent turns them into implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.github.com/spec-kit/index.html" rel="noopener noreferrer"&gt;GitHub Spec Kit&lt;/a&gt; is the clearest mainstream example. Its documentation reports more than 121,000 GitHub stars and 35 coding-agent integrations. Its default workflow uses a chain of files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;spec.md&lt;/code&gt; records the requirements and desired outcome.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plan.md&lt;/code&gt; explains the technical design and implementation approach.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks.md&lt;/code&gt; breaks the plan into executable units.&lt;/li&gt;
&lt;li&gt;The agent implements and validates the change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A project constitution can carry principles that should apply across many changes.&lt;/p&gt;

&lt;p&gt;Spec Kit is not the only approach. &lt;a href="https://github.com/Fission-AI/OpenSpec" rel="noopener noreferrer"&gt;OpenSpec&lt;/a&gt;, &lt;a href="https://kiro.dev/docs/specs/quick-spec/" rel="noopener noreferrer"&gt;Kiro Specs&lt;/a&gt;, and project-specific &lt;a href="https://developers.openai.com/cookbook/articles/codex_exec_plans" rel="noopener noreferrer"&gt;&lt;code&gt;PLANS.md&lt;/code&gt;&lt;/a&gt; use different files and workflows. They are nevertheless converging on a recognizable sequence: requirements, design, plan, tasks, implementation, and validation become separate artifacts that humans can review and agents can follow.&lt;/p&gt;

&lt;p&gt;These files describe a generic software development lifecycle. Applications also need instructions for their particular domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain files give agents specialized context
&lt;/h2&gt;

&lt;p&gt;A frontend, an identity platform, and a data pipeline do not need the same context. Domain files give agents specialized instructions for the parts of a system that generic onboarding, skills, and plans cannot fully describe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ARCHITECTURE.md&lt;/code&gt; can describe system boundaries, components, dependencies, NFRs, and long-lived architectural decisions. It is an established human documentation convention that becomes operational for agents when project instructions tell them when to read it.&lt;/li&gt;
&lt;li&gt;Google Labs' &lt;a href="https://github.com/google-labs-code/design.md" rel="noopener noreferrer"&gt;&lt;code&gt;DESIGN.md&lt;/code&gt;&lt;/a&gt; describes visual identity, design tokens, components, and design rationale. The project currently labels the format alpha.&lt;/li&gt;
&lt;li&gt;WorkOS' &lt;a href="https://github.com/workos/auth.md" rel="noopener noreferrer"&gt;&lt;code&gt;AUTH.md&lt;/code&gt;&lt;/a&gt; is an experimental, service-hosted recipe that teaches agents how to register and authenticate on behalf of users.&lt;/li&gt;
&lt;li&gt;Kilo's &lt;a href="https://kilo.ai/docs/automate/code-reviews/overview" rel="noopener noreferrer"&gt;&lt;code&gt;REVIEW.md&lt;/code&gt;&lt;/a&gt; lets a repository define review priorities, severity, skipped files, verification expectations, and how a review agent should divide work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These formats have different maturity levels and scopes. &lt;code&gt;ARCHITECTURE.md&lt;/code&gt; is a long-standing documentation convention. &lt;code&gt;DESIGN.md&lt;/code&gt;, &lt;code&gt;AUTH.md&lt;/code&gt;, and &lt;code&gt;REVIEW.md&lt;/code&gt; are emerging, domain-specific experiments. Their common direction is clear: more specialized engineering knowledge is becoming directly legible to agents.&lt;/p&gt;

&lt;p&gt;Some of that knowledge is designed in advance. Other knowledge emerges only while the software is being built and operated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory makes learned context durable
&lt;/h2&gt;

&lt;p&gt;An unexpected build prerequisite, a debugging pattern, or the reason a deployment failed might previously have ended up in a ticket comment, commit message, Slack thread, incident report, or SRE playbook. Those records range from ephemeral to durable, but a coding agent may not find the relevant lesson when it begins the next task.&lt;/p&gt;

&lt;p&gt;Agent memory keeps learned context associated with a repository and available across sessions. Claude Code makes the authorship distinction unusually clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Humans write &lt;code&gt;CLAUDE.md&lt;/code&gt; to provide shared instructions, conventions, and project context.&lt;/li&gt;
&lt;li&gt;Claude writes auto memory into a &lt;code&gt;MEMORY.md&lt;/code&gt; index and optional topic files such as &lt;code&gt;debugging.md&lt;/code&gt; and &lt;code&gt;api-conventions.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The auto memory is repository-specific but machine-local. Claude normally stores it outside the Git repository, and it is not automatically shared with the team. &lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;Anthropic documents the two mechanisms separately&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Memory therefore does not replace tickets, commit history, or operational documentation. It reduces repeated rediscovery. When a learned fact becomes important to the whole team, it needs a promotion path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent records a tentative observation in local memory.&lt;/li&gt;
&lt;li&gt;A human reviews it when the observation recurs or affects shared work.&lt;/li&gt;
&lt;li&gt;Durable knowledge moves beside the source code into a project rule, skill, ADR, or domain document.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tentative knowledge stays local. Reviewed knowledge becomes shared. Kilo is experimenting with a similar loop for review: it can &lt;a href="https://blog.kilo.ai/p/code-reviews-md" rel="noopener noreferrer"&gt;analyze how a team responds to review comments and propose changes&lt;/a&gt; to the repository's review guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting the Markdown files together
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vayijl44nhzhe20o8ad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vayijl44nhzhe20o8ad.png" alt="The metacode layer maps an agent-ready project structure to the project knowledge each format carries" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shared project files carry reviewed knowledge beside the source code. Agent-written memory remains machine-local until a durable lesson is promoted into the repository.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The practical distinction is the role each file plays, who writes it, and how broadly it is supported.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu4rz5njqnq15f72q36x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu4rz5njqnq15f72q36x.png" alt="A comparison of agent-facing Markdown files by their role, typical author, and support status" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The formats range from cross-tool standards and established vendor conventions to emerging domain-specific experiments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A project does not need every file. Use the smallest set that agents can reliably discover, keep reviewed knowledge beside the source code, and treat vendor-specific files as thin compatibility bridges when another file is canonical. &lt;code&gt;AUTH.md&lt;/code&gt; remains service-hosted, while Claude's auto memory stays machine-local until a human promotes a durable lesson into the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The repository is becoming the meeting point between source code and &lt;strong&gt;metacode&lt;/strong&gt;: the Markdown that carries requirements, NFRs, architecture, design, rules, procedures, plans, and durable learning.&lt;/p&gt;

&lt;p&gt;When agents can read both, they act as intent compilers. Source code becomes a byproduct: the executable result of human intent and judgment made legible to the agent.&lt;/p&gt;

&lt;p&gt;The engineering task is to keep that metacode scoped, reviewed, and current. It does not replace testing or review. It gives the next code change a better source.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://generativeprogrammer.com/p/emerging-markdown-formats-that-shape" rel="noopener noreferrer"&gt;The Generative Programmer&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
      <category>agents</category>
    </item>
    <item>
      <title>10 Open-Source Projects for Securing AI Agent Skills</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Sun, 09 Aug 2026 12:42:15 +0000</pubDate>
      <link>https://dev.to/bibryam/10-open-source-projects-for-securing-ai-agent-skills-li9</link>
      <guid>https://dev.to/bibryam/10-open-source-projects-for-securing-ai-agent-skills-li9</guid>
      <description>&lt;p&gt;In July, &lt;a href="https://huggingface.co/blog/security-incident-july-2026" rel="noopener noreferrer"&gt;Hugging Face disclosed an intrusion driven end to end by an autonomous AI agent&lt;/a&gt;, starting with a malicious dataset and reaching credential harvesting and lateral movement across internal clusters. &lt;a href="https://arxiv.org/abs/2601.10338" rel="noopener noreferrer"&gt;SkillScan researchers&lt;/a&gt; analyzed 31,132 public skills and flagged potentially dangerous patterns in 26.1%, while 5.2% showed high-severity patterns strongly suggesting malicious intent. Days later, &lt;a href="https://blogs.nvidia.com/blog/open-secure-ai-alliance/" rel="noopener noreferrer"&gt;NVIDIA and founding members launched the Open Secure AI Alliance&lt;/a&gt; to build and share open technologies for safeguarding software and agents; here are ten open-source projects already working across that emerging stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The emerging skill-security stack
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frbhevg6446l4ywu6bwya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frbhevg6446l4ywu6bwya.png" alt="Five-phase map showing where ten open-source agent-security projects fit before deployment and during execution" width="798" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The map shows each project's primary control point. Each project section below explains what it does, how it works, who it is for, and where its boundary ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="https://github.com/NVIDIA/SkillSpector" rel="noopener noreferrer"&gt;NVIDIA SkillSpector&lt;/a&gt;: a pre-install scanner for skills
&lt;/h2&gt;

&lt;p&gt;SkillSpector answers the first question most users have when they find a new skill: &lt;strong&gt;is this safe enough to install?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It scans a local file or directory, Git repository, URL, or ZIP and returns a risk score from 0 to 100, severity, recommendation, and findings. Its MCP wrapper also returns a &lt;code&gt;safe_to_install&lt;/code&gt; signal. Reports can be written for humans or automation, including JSON, Markdown, and SARIF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; A source loader inventories the artifact, then deterministic checks inspect 68 patterns across 17 categories. Dependency findings use live OSV data when reachable and fall back to bundled data when it is not. An optional LLM pass adds semantic review before the findings are merged into an install recommendation. &lt;code&gt;skillspector scan ./my-skill --no-llm&lt;/code&gt; needs no model key, although dependency coordinates may still be sent to OSV.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Individual developers, catalog maintainers, and CI pipelines that want a quick admission check with a clear decision at the end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; SkillSpector does not execute the skill. Static and semantic inspection can identify suspicious intent and known patterns, but it cannot prove what a skill will do in a live environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmurdbfzrwoc0r9spalc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmurdbfzrwoc0r9spalc.png" alt="SkillSpector pipeline scanning a skill with deterministic rules, OSV, and optional LLM review to produce a risk score, findings, and install recommendation." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://github.com/cisco-ai-defense/skill-scanner" rel="noopener noreferrer"&gt;Cisco AI Defense Skill Scanner&lt;/a&gt;: deeper multi-engine static analysis
&lt;/h2&gt;

&lt;p&gt;Cisco AI Defense Skill Scanner is also a pre-install scanner, but it emphasizes a collection of specialized analysis engines and configurable security policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It scans a skill directory for malicious instructions, suspicious code, vulnerable execution paths, and behavioral risks, then produces console, JSON, Markdown, HTML, table, or SARIF output. A strict, balanced, or permissive scan policy tunes detection, while a separate severity threshold turns the result into a CI decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; The default core combines YAML signatures and YARA rules, Python bytecode integrity checks, and shell-pipeline taint analysis. Optional local analyzers add Python AST and dataflow, trigger checks, and OSV lookups. Optional model and service analyzers add LLM review, meta-analysis, VirusTotal, or Cisco AI Defense. A strict high-severity CI gate is &lt;code&gt;skill-scanner scan ./skill --policy strict --fail-on-severity high&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; AppSec and platform teams that want explainable, CI-oriented checks and more language-aware analysis than a simple pattern scan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; The core path is static: it inspects what could happen but does not run the skill. Some optional enrichments use external services and therefore do not belong in a strictly offline setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3nu1i1d3g6z0h6wjqaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3nu1i1d3g6z0h6wjqaz.png" alt="Cisco Skill Scanner combines rules, YARA, bytecode checks, and shell taint with optional AST, model, and service analyzers before policy and CI output." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;a href="https://github.com/Fangcun-AI/SkillWard" rel="noopener noreferrer"&gt;SkillWard&lt;/a&gt;: escalate suspicious skills into a sandbox
&lt;/h2&gt;

&lt;p&gt;SkillWard treats skill analysis as an escalation pipeline. Cheap checks run first; uncertain cases can progress all the way to controlled execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It produces a behavioral verdict and evidence for a skill, including actions that are only visible when the skill is actually invoked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; Stage A uses YARA, regular expressions, and static inspection. Stage B asks a model to classify intent and escalates uncertain cases. Stage C launches the skill with an in-container agent inside Docker. A guard inspects tool calls and file content for evidence such as network access, sensitive writes, credential access, and exfiltration, while decoys make malicious behavior easier to expose. The semantic stage can use a locally hosted model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Security researchers, reviewers, and higher-assurance catalogs investigating a suspicious or ambiguous skill after static scanning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; Dynamic evidence is stronger, but it is also slower and depends on the test scenario reaching the malicious branch. “Nothing happened in this run” is not proof of safety.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwaien1eehxur2fpdtwzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwaien1eehxur2fpdtwzl.png" alt="SkillWard escalates from static and semantic checks to guarded Docker execution with decoys and tool-call evidence." width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;a href="https://github.com/HeadyZhang/agent-audit" rel="noopener noreferrer"&gt;Agent Audit&lt;/a&gt;: scan the whole agent repository
&lt;/h2&gt;

&lt;p&gt;Agent Audit broadens the target beyond a packaged skill. It looks for security problems across the surrounding agent application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It finds dangerous operations, untrusted-data flows into sensitive tools, exposed secrets, risky MCP configuration, skill and package risks, and excessive privileges. Its deepest AST and taint analysis is for Python, while the current scanner also covers TypeScript and JavaScript, Go, Solidity, &lt;code&gt;SKILL.md&lt;/code&gt;, and configuration files. Results can fail a build and can be exported as SARIF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; Repository discovery feeds several analyzers: a Python AST scanner, intra-procedural source-to-sink taint tracker, tool-boundary analyzer, three-stage secret scanner, MCP configuration scanner, privilege scanner, and a shared rule engine. The current project documents 72 rules. A typical static gate is &lt;code&gt;agent-audit scan . --fail-on high&lt;/code&gt;; an optional dynamic mode can connect to MCP servers for read-only inspection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Developers and AppSec teams reviewing an agent as an application, especially Python-based projects with tools and MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; The default scan is static and does not run the agent application. Optional MCP inspection expands discovery, but the project is not a runtime monitor or execution sandbox.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd6tzbx9b8dhjjc5ldwj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd6tzbx9b8dhjjc5ldwj6.png" alt="Agent Audit repository discovery feeds AST, taint, secret, MCP, tool-boundary, and privilege analyzers into findings and SARIF." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;a href="https://github.com/affaan-m/agentshield" rel="noopener noreferrer"&gt;AgentShield&lt;/a&gt;: audit what is active on a developer machine
&lt;/h2&gt;

&lt;p&gt;AgentShield shifts the target again, from a single downloaded artifact to the agent configuration already present in a project or user environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; Its default mode discovers agent-related files and checks secrets, permissions, hooks, MCP configuration, and agent settings against 102 static rules in five categories. It can also execute hooks in a controlled temporary directory, run active injection tests, watch configuration changes, and install a &lt;code&gt;PreToolUse&lt;/code&gt; policy hook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; The default invocation selects one root: a local &lt;code&gt;.claude&lt;/code&gt; directory, otherwise the home &lt;code&gt;.claude&lt;/code&gt; directory, otherwise the current directory. Discovery classifies findings by &lt;code&gt;runtimeConfidence&lt;/code&gt;, separating active runtime and project-local material from examples, documentation, plugins, and hooks. &lt;code&gt;npx ecc-agentshield scan&lt;/code&gt; runs the static checks; optional modes add model review, hook execution, continuous watch, or runtime allow and block decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Developers, endpoint-security teams, and CI jobs that need to understand the effective agent attack surface of an environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; The default scan is a posture snapshot. Its optional watch and &lt;code&gt;PreToolUse&lt;/code&gt; modes expand the boundary, but the hook sandbox is a host child process with a temporary working directory, not a hard operating-system or network boundary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9yw247h4ju1zj1njk3ic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9yw247h4ju1zj1njk3ic.png" alt="AgentShield discovers active agent configuration, applies static rules, and optionally executes hooks, watches changes, and enforces PreToolUse policy." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. &lt;a href="https://github.com/microsoft/apm" rel="noopener noreferrer"&gt;Microsoft Agent Package Manager&lt;/a&gt;: govern what gets installed
&lt;/h2&gt;

&lt;p&gt;Microsoft Agent Package Manager, or APM, treats prompts, skills, MCP servers, and other agent assets as a dependency graph rather than files copied by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It resolves declared agent dependencies, applies installation policy, deploys approved assets to a target harness, records exact versions and integrity data, and can export a CycloneDX or SPDX SBOM from the lockfile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; &lt;code&gt;apm.yml&lt;/code&gt; declares the package graph and &lt;code&gt;apm-policy.yml&lt;/code&gt; defines admission rules. During &lt;code&gt;apm install&lt;/code&gt;, the resolver fetches dependencies into a cache, scans for hidden Unicode, requires explicit trust for transitive MCP server declarations, checks policy and integrity, deploys approved assets, and writes &lt;code&gt;apm.lock.yaml&lt;/code&gt;. Later, &lt;code&gt;apm audit&lt;/code&gt; verifies the declared, locked, and deployed state and replays a scratch install to detect drift. &lt;code&gt;apm lock export&lt;/code&gt; produces the SBOM separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Platform teams that want repeatable, reviewable distribution of agent assets across developers and CI environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; APM governs &lt;strong&gt;what gets installed&lt;/strong&gt;. It does not execute downloaded package code by default, but explicit lifecycle scripts and experimental canvas extensions are execution exceptions. The agent harness still governs &lt;strong&gt;what runs&lt;/strong&gt;, so installation control must be paired with runtime policy or isolation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxusqud4389ddw2t8wd89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxusqud4389ddw2t8wd89.png" alt="Microsoft APM resolves an agent package manifest under policy, integrity, and trust checks, then deploys assets and records a lockfile, audit, and SBOM." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. &lt;a href="https://github.com/NVIDIA/skills" rel="noopener noreferrer"&gt;NVIDIA Verified Agent Skills&lt;/a&gt;: signed provenance plus evaluation evidence
&lt;/h2&gt;

&lt;p&gt;NVIDIA's verified agent-skills catalog is less a scanner than a trust and distribution pattern for published skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It gives consumers a curated catalog in which each accepted skill carries a skill specification, skill card, evaluation evidence, security review, and a detached signature that can be verified before installation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; An upstream release pipeline evaluates the skill, runs SkillSpector review, resolves findings, and signs the approved artifact. The catalog's hourly mirror checks required artifacts, signature state, and source or signature drift; it does not rerun the evaluation, and &lt;code&gt;BENCHMARK.md&lt;/code&gt; is commonly published rather than required by the catalog gate. Consumers separately verify the directory against NVIDIA's root certificate, then install it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Skill publishers, catalog operators, and organizations that need provenance and tamper detection, not just a point-in-time vulnerability scan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; A valid signature proves origin and integrity, not harmlessness. The catalog’s review raises confidence, but runtime controls are still needed after a verified skill starts acting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5txyl0ymenamhnobmn0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5txyl0ymenamhnobmn0t.png" alt="NVIDIA Verified Agent Skills release flow combines evaluation, SkillSpector review, and signing with catalog checks and consumer signature verification." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. &lt;a href="https://github.com/NVIDIA/OpenShell" rel="noopener noreferrer"&gt;NVIDIA OpenShell&lt;/a&gt;: contain the running agent
&lt;/h2&gt;

&lt;p&gt;NVIDIA OpenShell moves the control point from artifact inspection to execution. It assumes agent code and skills may be untrusted and gives them a constrained place to run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It isolates an agent in a sandbox and enforces policy over filesystem access, processes, network connections, and model inference. Denied operations are stopped at the boundary rather than merely reported afterward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; The OpenShell Gateway stores desired state and asks a compute driver to provision the sandbox. Inside that sandbox, a Supervisor launches the restricted process. Filesystem and process controls are enforced locally, ordinary egress passes through a local policy proxy and OPA, and model traffic passes through an inference router. Docker and Podman are local options, the VM path is experimental, and Kubernetes is the cluster driver. On Kubernetes, that driver creates a Sandbox resource for the separate Agent Sandbox controller to reconcile into a Pod. The commands &lt;code&gt;openshell sandbox create -- claude&lt;/code&gt; and &lt;code&gt;openshell policy set demo --policy policy.yaml --wait&lt;/code&gt; are valid, but only network and inference policy are hot reloadable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Platform and infrastructure teams running coding agents or other tool-using agents that need OS-level containment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; OpenShell limits the blast radius of execution; it does not certify that the skill source is safe or decide whether the business intent of an allowed action is appropriate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuya0er0zmyd9longuugp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuya0er0zmyd9longuugp.png" alt="OpenShell gateway provisions a sandbox whose supervisor, policy proxy, and inference router enforce process, filesystem, network, and model controls." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. &lt;a href="https://github.com/kubernetes-sigs/agent-sandbox" rel="noopener noreferrer"&gt;Kubernetes Agent Sandbox&lt;/a&gt;: provision isolated agent workspaces on Kubernetes
&lt;/h2&gt;

&lt;p&gt;Kubernetes Agent Sandbox is the project that is easy to confuse with OpenShell. It is developed under Kubernetes SIG Apps rather than being a separate CNCF-hosted project. Kubernetes itself is a CNCF graduated project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It provides a standardized Kubernetes API for isolated, stateful, singleton workloads, the shape needed by long-running coding agents and other autonomous runtimes. A sandbox can keep a stable identity and persistent storage, then be suspended, resumed, or replaced without treating it like a replicated web service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; The core &lt;code&gt;Sandbox&lt;/code&gt; CRD and controller reconcile a Pod and its lifecycle, with a conditional headless Service and optional PVCs. Extension CRDs add reusable &lt;code&gt;SandboxTemplate&lt;/code&gt; definitions, &lt;code&gt;SandboxWarmPool&lt;/code&gt; capacity, and &lt;code&gt;SandboxClaim&lt;/code&gt; allocation. A claim can request a warm pool, the pool references a template, and the controllers allocate or adopt a Sandbox. A template can add a managed NetworkPolicy and select a stronger &lt;code&gt;RuntimeClass&lt;/code&gt;, including gVisor or Kata Containers. The &lt;a href="https://kubernetes.io/blog/2026/03/20/running-agents-on-kubernetes-with-agent-sandbox/" rel="noopener noreferrer"&gt;Kubernetes introduction&lt;/a&gt; explains the broader model.&lt;/p&gt;

&lt;p&gt;Google Cloud has also introduced &lt;a href="https://cloud.google.com/blog/products/containers-kubernetes/bringing-you-agent-sandbox-on-gke-and-agent-substrate" rel="noopener noreferrer"&gt;Agent Substrate&lt;/a&gt;, an adjacent open-source project that pairs sandbox and snapshot capabilities with a specialized control plane for denser agent execution on Kubernetes. It maps many stateful actors onto fewer ready worker Pods, then suspends, resumes, and routes them on demand. The &lt;a href="https://github.com/agent-substrate/substrate" rel="noopener noreferrer"&gt;repository&lt;/a&gt; is still early and not production ready, and its threat model says security hardening is minimal, so treat it as a scalability substrate rather than an additional security control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Platform teams building a multi-tenant Kubernetes substrate for agent runtimes, especially when they need stable workspaces, warm starts, persistent state, and a common API that several agent platforms can consume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; Agent Sandbox provisions and manages the workload boundary; it is not an agent-aware security policy engine. The actual strength of isolation depends on the selected runtime, network policy, credentials, and cluster configuration. OpenShell can sit above it to add filesystem, process, egress, inference, and credential policy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjed14y2h4ws3f5zo7dfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjed14y2h4ws3f5zo7dfe.png" alt="Kubernetes Agent Sandbox uses templates, warm pools, claims, and controllers to manage stateful agent Pods with optional storage, network policy, and runtime isolation." width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. &lt;a href="https://github.com/microsoft/agent-governance-toolkit" rel="noopener noreferrer"&gt;Microsoft Agent Governance Toolkit&lt;/a&gt;: policy-gate every action
&lt;/h2&gt;

&lt;p&gt;Microsoft Agent Governance Toolkit, or AGT, focuses on the semantic action an agent is about to take: send an email, query data, call a tool, or delegate to another agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; It wraps selected callables and configured framework intervention points, evaluates deterministic policy, can require human approval, and records an audit decision. A denied wrapped call never reaches the underlying tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works.&lt;/strong&gt; A developer wraps a function with &lt;code&gt;govern(my_tool, policy="policy.yaml")&lt;/code&gt;, which returns a &lt;code&gt;GovernedCallable&lt;/code&gt;. Each wrapped invocation builds governance context, runs the YAML &lt;code&gt;PolicyEngine&lt;/code&gt; with deny-overrides behavior, optionally requests approval, and writes to a Merkle-chained audit log. The broader toolkit separately offers Agent Control Specification support, OPA and Cedar backends, identity and trust, framework adapters, sandboxing, MCP security, compliance, and SRE modules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Application, security, and compliance teams that need explainable authorization for every consequential agent action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; The basic middleware and the agent share a process boundary, and the default audit log is in memory unless an external sink is configured. Microsoft's own guidance recommends container isolation for stronger protection; the policy gate should not be mistaken for the operating-system boundary provided by OpenShell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx5sj6pu3fbuepl41mpm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx5sj6pu3fbuepl41mpm4.png" alt="A GovernedCallable sends action context through deterministic policy and optional approval before allow or deny, with a Merkle-chained audit record." width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the projects overlap and where they do not
&lt;/h2&gt;

&lt;p&gt;The first five projects all &lt;strong&gt;find risk&lt;/strong&gt;, but their inspection targets are different. SkillSpector and Cisco Skill Scanner focus most directly on a skill artifact. SkillWard adds controlled execution. Agent Audit follows dangerous flows through the wider agent codebase. AgentShield inventories the configuration that is active in an environment.&lt;/p&gt;

&lt;p&gt;APM and NVIDIA Verified Agent Skills operate on the &lt;strong&gt;software-supply-chain problem&lt;/strong&gt;. APM makes installation deterministic and policy-controlled; NVIDIA’s catalog adds publication requirements, evaluation evidence, and signed provenance. Neither replaces source analysis or runtime containment.&lt;/p&gt;

&lt;p&gt;The final three control points &lt;strong&gt;intervene while an agent is operating&lt;/strong&gt;, but at different boundaries. AGT authorizes the agent’s intended action. OpenShell constrains what the process can actually do at the operating-system and network boundary. Kubernetes Agent Sandbox provisions and manages the underlying stateful workload when that process runs on Kubernetes.&lt;/p&gt;

&lt;p&gt;That produces a useful three-line mental model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intent:&lt;/strong&gt; Is this requested action allowed for this agent? AGT answers that question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capability:&lt;/strong&gt; Can this process reach the resource at all? OpenShell enforces that boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substrate:&lt;/strong&gt; Where does the isolated stateful workload run? Agent Sandbox provides that lifecycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison at a glance
&lt;/h2&gt;

&lt;p&gt;The table condenses the primary target, mechanism, effect, and GitHub stars for all ten projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz6v1ldwlfoiixnmnviyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz6v1ldwlfoiixnmnviyd.png" alt="Ten open-source agent-security projects compared by target, timing, mechanism, effect, approximate GitHub stars, and license" width="800" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For an organization adopting third-party skills, I would start with four layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scan before trust.&lt;/strong&gt; Run SkillSpector or Cisco Skill Scanner on every incoming skill; escalate ambiguous, high-risk artifacts to SkillWard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control distribution.&lt;/strong&gt; Use APM-style manifests, policies, lockfiles, and SBOMs; verify signatures when a curated catalog provides them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorize actions.&lt;/strong&gt; Put deterministic policy and audit around consequential tool calls with AGT or an equivalent middleware gate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contain execution.&lt;/strong&gt; Run the agent inside an OpenShell-style sandbox, and use Agent Sandbox as the Kubernetes substrate when the workload needs cluster-native lifecycle and isolation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No single project spans the entire lifecycle yet. That is not a weakness in the ecosystem; it is the shape of defense in depth. The important step is to stop treating a skill as “just a Markdown file.” It is a supply-chain artifact that can steer a privileged, autonomous runtime.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://generativeprogrammer.com/p/10-open-source-projects-for-securing" rel="noopener noreferrer"&gt;The Generative Programmer&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Emerging Markdown Formats That Shape Coding Agent Behavior</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Mon, 03 Aug 2026 10:25:16 +0000</pubDate>
      <link>https://dev.to/bibryam/emerging-markdown-formats-that-shape-coding-agent-behavior-3ik9</link>
      <guid>https://dev.to/bibryam/emerging-markdown-formats-that-shape-coding-agent-behavior-3ik9</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical map of the rules, procedures, plans, domain knowledge, and memory that guide agent-assisted software changes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For years, the knowledge required to change software lived in many places. Non-functional requirements (NFRs), architectural constraints, and design decisions were captured in solution architecture documents, ADRs, security reviews, and wikis. Product intent lived in design documents and mockups. Work was broken down into tickets. Operational lessons survived in incident reports, Slack threads, playbooks, and the heads of experienced developers.&lt;/p&gt;

&lt;p&gt;The repository contained the implementation: source code, tests, configuration, and dependency manifests. Developers read across the surrounding artifacts, reconciled the desired outcome with architectural judgment, and translated both into code.&lt;/p&gt;

&lt;p&gt;As AI-assisted coding becomes normal, the repository is becoming the meeting point between that project knowledge and the agent changing the software. A monorepo brings codebases and their dependency graph together. An agent-ready repository also brings in the knowledge required to change them correctly.&lt;/p&gt;

&lt;p&gt;Software has always been understood through different lenses: principles and NFRs, architecture and design, concrete specifications, implementation plans, domain rules, and lessons learned during operation. A growing family of Markdown files now captures these dimensions in forms that coding agents can discover and use. This article looks at the formats and tools that are emerging. Together, they let an agent act as an intent compiler, translating human intent and judgment into source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent onboarding starts with a README for agents
&lt;/h2&gt;

&lt;p&gt;A human onboards to a project once. An agent effectively onboards every time it starts a task. It needs to orient itself in the repository, discover the relevant commands and conventions, and understand the rules that apply before it changes anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; is the closest thing to a neutral standard for this purpose. The project describes it as a README for agents. A root file can explain the repository structure, build commands, tests, coding conventions, and pull request expectations. Nested files can add instructions for a package or subsystem. The format deliberately has no required fields.&lt;/p&gt;

&lt;p&gt;The ecosystem also has vendor-native alternatives that serve the same purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; provides cross-tool project guidance for Codex, Cursor, Cline, Copilot, OpenCode, and other compatible agents.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;.claude/rules/&lt;/code&gt;&lt;/a&gt; provide standing and path-scoped guidance for Claude Code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://geminicli.com/docs/cli/gemini-md/" rel="noopener noreferrer"&gt;&lt;code&gt;GEMINI.md&lt;/code&gt;&lt;/a&gt; provides hierarchical context for Gemini CLI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/add-custom-instructions/add-repository-instructions" rel="noopener noreferrer"&gt;&lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; and path-specific instruction files&lt;/a&gt; guide GitHub Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.cline.bot/customization/cline-rules" rel="noopener noreferrer"&gt;&lt;code&gt;.clinerules/&lt;/code&gt;&lt;/a&gt; carries persistent and conditional rules for Cline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use &lt;code&gt;pnpm&lt;/code&gt;, not &lt;code&gt;npm&lt;/code&gt;. Do not edit generated clients. Run the billing integration tests after changing an invoice flow. Read the relevant ADR before moving a service boundary. These are standing instructions that should remain true across many tasks.&lt;/p&gt;

&lt;p&gt;Once the agent understands the repository, the next question is how to perform a particular kind of work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills package repeatable procedures
&lt;/h2&gt;

&lt;p&gt;A skill is a playbook tailored to a particular kind of work.&lt;/p&gt;

&lt;p&gt;Consider a database migration. &lt;code&gt;AGENTS.md&lt;/code&gt; might state that every schema change needs a rollback path. A migration skill can describe the complete procedure: inspect the current schema, create the migration, update generated types, run compatibility checks, verify the rollback, and prepare the review summary.&lt;/p&gt;

&lt;p&gt;The open &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt; gives that playbook a portable package. Each skill has a required &lt;code&gt;SKILL.md&lt;/code&gt; containing metadata and instructions. It may also include scripts, references, templates, and other assets. Agents initially see the metadata, load the full instructions when the skill is relevant, then access supporting material as needed.&lt;/p&gt;

&lt;p&gt;Agent Skills &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;originated at Anthropic&lt;/a&gt; and were released as an open standard. They are separate from MCP, which Anthropic contributed to the &lt;a href="https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation" rel="noopener noreferrer"&gt;Agentic AI Foundation&lt;/a&gt;. The skill format is now documented by &lt;a href="https://developers.openai.com/codex/skills/" rel="noopener noreferrer"&gt;Codex&lt;/a&gt;, &lt;a href="https://geminicli.com/docs/cli/creating-skills/" rel="noopener noreferrer"&gt;Gemini CLI&lt;/a&gt;, &lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/add-skills" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;, and other compatible clients.&lt;/p&gt;

&lt;p&gt;The boundary is concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; and native rule files describe standing context and constraints.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SKILL.md&lt;/code&gt; describes a repeatable procedure invoked for a specific task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A procedure explains how to work. It still needs a reviewed description of what should be built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning files make software design reviewable
&lt;/h2&gt;

&lt;p&gt;Software design, planning, and task breakdown are also moving into versioned Markdown. When they exist only in chat, they disappear into session history. When they become repository artifacts, architects and developers can review them before an agent turns them into implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.github.com/spec-kit/index.html" rel="noopener noreferrer"&gt;GitHub Spec Kit&lt;/a&gt; is the clearest mainstream example. Its documentation reports more than 121,000 GitHub stars and 35 coding-agent integrations. Its default workflow uses a chain of files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;spec.md&lt;/code&gt; records the requirements and desired outcome.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plan.md&lt;/code&gt; explains the technical design and implementation approach.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks.md&lt;/code&gt; breaks the plan into executable units.&lt;/li&gt;
&lt;li&gt;The agent implements and validates the change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A project constitution can carry principles that should apply across many changes.&lt;/p&gt;

&lt;p&gt;Spec Kit is not the only approach. &lt;a href="https://github.com/Fission-AI/OpenSpec" rel="noopener noreferrer"&gt;OpenSpec&lt;/a&gt;, &lt;a href="https://kiro.dev/docs/specs/quick-spec/" rel="noopener noreferrer"&gt;Kiro Specs&lt;/a&gt;, and project-specific &lt;a href="https://developers.openai.com/cookbook/articles/codex_exec_plans" rel="noopener noreferrer"&gt;&lt;code&gt;PLANS.md&lt;/code&gt;&lt;/a&gt; use different files and workflows. They are nevertheless converging on a recognizable sequence: requirements, design, plan, tasks, implementation, and validation become separate artifacts that humans can review and agents can follow.&lt;/p&gt;

&lt;p&gt;These files describe a generic software development lifecycle. Applications also need instructions for their particular domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain files give agents specialized context
&lt;/h2&gt;

&lt;p&gt;A frontend, an identity platform, and a data pipeline do not need the same context. Domain files give agents specialized instructions for the parts of a system that generic onboarding, skills, and plans cannot fully describe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ARCHITECTURE.md&lt;/code&gt; can describe system boundaries, components, dependencies, NFRs, and long-lived architectural decisions. It is an established human documentation convention that becomes operational for agents when project instructions tell them when to read it.&lt;/li&gt;
&lt;li&gt;Google Labs' &lt;a href="https://github.com/google-labs-code/design.md" rel="noopener noreferrer"&gt;&lt;code&gt;DESIGN.md&lt;/code&gt;&lt;/a&gt; describes visual identity, design tokens, components, and design rationale. The project currently labels the format alpha.&lt;/li&gt;
&lt;li&gt;WorkOS' &lt;a href="https://github.com/workos/auth.md" rel="noopener noreferrer"&gt;&lt;code&gt;AUTH.md&lt;/code&gt;&lt;/a&gt; is an experimental, service-hosted recipe that teaches agents how to register and authenticate on behalf of users.&lt;/li&gt;
&lt;li&gt;Kilo's &lt;a href="https://kilo.ai/docs/automate/code-reviews/overview" rel="noopener noreferrer"&gt;&lt;code&gt;REVIEW.md&lt;/code&gt;&lt;/a&gt; lets a repository define review priorities, severity, skipped files, verification expectations, and how a review agent should divide work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These formats have different maturity levels and scopes. &lt;code&gt;ARCHITECTURE.md&lt;/code&gt; is a long-standing documentation convention. &lt;code&gt;DESIGN.md&lt;/code&gt;, &lt;code&gt;AUTH.md&lt;/code&gt;, and &lt;code&gt;REVIEW.md&lt;/code&gt; are emerging, domain-specific experiments. Their common direction is clear: more specialized engineering knowledge is becoming directly legible to agents.&lt;/p&gt;

&lt;p&gt;Some of that knowledge is designed in advance. Other knowledge emerges only while the software is being built and operated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory makes learned context durable
&lt;/h2&gt;

&lt;p&gt;An unexpected build prerequisite, a debugging pattern, or the reason a deployment failed might previously have ended up in a ticket comment, commit message, Slack thread, incident report, or SRE playbook. Those records range from ephemeral to durable, but a coding agent may not find the relevant lesson when it begins the next task.&lt;/p&gt;

&lt;p&gt;Agent memory keeps learned context associated with a repository and available across sessions. Claude Code makes the authorship distinction unusually clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Humans write &lt;code&gt;CLAUDE.md&lt;/code&gt; to provide shared instructions, conventions, and project context.&lt;/li&gt;
&lt;li&gt;Claude writes auto memory into a &lt;code&gt;MEMORY.md&lt;/code&gt; index and optional topic files such as &lt;code&gt;debugging.md&lt;/code&gt; and &lt;code&gt;api-conventions.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The auto memory is repository-specific but machine-local. Claude normally stores it outside the Git repository, and it is not automatically shared with the team. &lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;Anthropic documents the two mechanisms separately&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Memory therefore does not replace tickets, commit history, or operational documentation. It reduces repeated rediscovery. When a learned fact becomes important to the whole team, it needs a promotion path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent records a tentative observation in local memory.&lt;/li&gt;
&lt;li&gt;A human reviews it when the observation recurs or affects shared work.&lt;/li&gt;
&lt;li&gt;Durable knowledge moves beside the source code into a project rule, skill, ADR, or domain document.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tentative knowledge stays local. Reviewed knowledge becomes shared. Kilo is experimenting with a similar loop for review: it can &lt;a href="https://blog.kilo.ai/p/code-reviews-md" rel="noopener noreferrer"&gt;analyze how a team responds to review comments and propose changes&lt;/a&gt; to the repository's review guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting the Markdown files together
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndw575sjnhnnij9xn6b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndw575sjnhnnij9xn6b3.png" alt="Project knowledge moves from scattered systems into an agent-ready repository guided by Markdown formats" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Project knowledge moves from scattered systems into an agent-ready repository, where versioned intent can guide implementation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The practical distinction is the role each file plays, who writes it, and how broadly it is supported.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu4rz5njqnq15f72q36x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu4rz5njqnq15f72q36x.png" alt="A comparison of agent-facing Markdown files by their role, typical author, and support status" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The formats range from cross-tool standards and established vendor conventions to emerging domain-specific experiments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A project does not need every file. Use the smallest set that agents can reliably discover, keep reviewed knowledge beside the source code, and treat vendor-specific files as thin compatibility bridges when another file is canonical. &lt;code&gt;AUTH.md&lt;/code&gt; remains service-hosted, while Claude's auto memory stays machine-local until a human promotes a durable lesson into the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The repository is becoming the meeting point between source code and &lt;strong&gt;metacode&lt;/strong&gt;: the Markdown that carries requirements, NFRs, architecture, design, rules, procedures, plans, and durable learning.&lt;/p&gt;

&lt;p&gt;When agents can read both, they act as intent compilers. Source code becomes a byproduct: the executable result of human intent and judgment made legible to the agent.&lt;/p&gt;

&lt;p&gt;The engineering task is to keep that metacode scoped, reviewed, and current. It does not replace testing or review. It gives the next code change a better source.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://generativeprogrammer.com/p/emerging-markdown-formats-that-shape" rel="noopener noreferrer"&gt;The Generative Programmer&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
      <category>agents</category>
    </item>
    <item>
      <title>Stop Babysitting Your Coding Agent. Give It Backpressure.</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Sun, 07 Jun 2026 07:59:17 +0000</pubDate>
      <link>https://dev.to/bibryam/stop-babysitting-your-coding-agent-give-it-backpressure-3gg1</link>
      <guid>https://dev.to/bibryam/stop-babysitting-your-coding-agent-give-it-backpressure-3gg1</guid>
      <description>&lt;p&gt;I keep seeing the same failure mode with coding agents:&lt;/p&gt;

&lt;p&gt;The agent writes a diff.&lt;br&gt;
The human notices a broken test.&lt;br&gt;
The human explains the failure.&lt;br&gt;
The agent retries.&lt;/p&gt;

&lt;p&gt;That is not review. That is babysitting.&lt;/p&gt;

&lt;p&gt;The fix is to move cheap, machine-readable feedback into the agent loop before the work reaches a human reviewer.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;A coding agent is a fast producer. The human reviewer is a slow consumer.&lt;/p&gt;

&lt;p&gt;That mismatch creates pressure. If the only meaningful feedback comes from the human, every trivial failure becomes review work. The human becomes the compiler, the test runner, the linter, the UI checker, and the reviewer.&lt;/p&gt;

&lt;p&gt;The agent can generate code quickly, but generation without feedback is open loop. It produces a diff without knowing whether that diff is correct, useful, safe, or ready.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://banay.me/dont-waste-your-backpressure/" rel="noopener noreferrer"&gt;Don’t waste your back pressure&lt;/a&gt;, Moss Banay describes this as wasted human backpressure: spending attention on mistakes the agent should have been able to detect itself, such as missing imports, broken builds, and visual errors.&lt;/p&gt;

&lt;p&gt;Marc Brooker makes a related point in &lt;a href="https://brooker.co.za/blog/2026/05/18/whats-easy-whats-hard.html" rel="noopener noreferrer"&gt;What’s Easy Now? What’s Hard Now?&lt;/a&gt;: agents are feedback loops around a useful but flawed model. The key shift is moving feedback from the human loop into the agent loop: build, test, inspect, repair, and iterate.&lt;/p&gt;

&lt;p&gt;So the question is not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How good is the model?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What feedback can the agent use without asking me?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;Backpressure is feedback that reaches the agent before the agent reaches the human.&lt;/p&gt;

&lt;p&gt;The useful loop 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;generate → verify → repair → repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backpressure can come from a type checker, a test, a linter, a build, a browser check, logs, traces, structural rules, or evals. The source matters less than the loop: the agent sees the failure, repairs the work, and tries again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent:&lt;/strong&gt; Move cheap correctness checks out of human review and into the agent loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context:&lt;/strong&gt; A coding agent can edit files, run commands, read failures, and retry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Agents produce code faster than humans can validate it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Expose fast, machine-readable feedback sensors to the agent: types, tests, linters, builds, browser checks, logs, traces, and structural rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; The agent fixes mechanical failures before review. The human focuses on intent, design, and trade-offs.&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%2Fzzceneqy1o643kauldx7.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%2Fzzceneqy1o643kauldx7.png" alt="Backpressure Loop Pattern" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What counts as backpressure
&lt;/h2&gt;

&lt;p&gt;Backpressure is any signal that can push back on bad agent output before a human spends attention on it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sensor&lt;/th&gt;
&lt;th&gt;What it catches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type checker&lt;/td&gt;
&lt;td&gt;Invalid shapes, missing fields, bad contracts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linter&lt;/td&gt;
&lt;td&gt;Unsafe patterns, formatting noise, local conventions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Focused tests&lt;/td&gt;
&lt;td&gt;Behavior regressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;Integration failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser check&lt;/td&gt;
&lt;td&gt;Broken UI, missing elements, visual drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs and traces&lt;/td&gt;
&lt;td&gt;Runtime behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural rules&lt;/td&gt;
&lt;td&gt;Architecture boundary violations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evals&lt;/td&gt;
&lt;td&gt;Meaning-level regressions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Thoughtworks calls these &lt;a href="https://www.thoughtworks.com/radar/techniques/feedback-sensors-for-coding-agents" rel="noopener noreferrer"&gt;feedback sensors for coding agents&lt;/a&gt;: deterministic quality gates wired into agent workflows so failures trigger self-correction.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A CI failure after the agent is done is a gate.&lt;/p&gt;

&lt;p&gt;A failure the agent sees while working is backpressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  A green build is not enough
&lt;/h2&gt;

&lt;p&gt;A green build is useful, but narrow.&lt;/p&gt;

&lt;p&gt;It tells you the code compiled, the formatter ran, and the existing tests passed. It does not prove the product rule survived. It does not prove the generated test asserts meaningful behavior. It does not prove the refactor respected the architecture.&lt;/p&gt;

&lt;p&gt;So the goal is not just to run CI earlier.&lt;/p&gt;

&lt;p&gt;The goal is to make feedback fast, specific, and actionable enough for the agent to repair the work.&lt;/p&gt;

&lt;p&gt;Bad feedback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The code is wrong.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better feedback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth/session.test.ts failed.

Expected expired sessions to redirect to /login.
Received 200 from /dashboard.

Fix the session expiration path.
Do not change the test.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version gives the agent something to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effective feedback beats more feedback
&lt;/h2&gt;

&lt;p&gt;More output is not the same as better backpressure.&lt;/p&gt;

&lt;p&gt;A recent arXiv preprint, &lt;a href="https://arxiv.org/abs/2605.29682" rel="noopener noreferrer"&gt;Scaling Laws for Agent Harnesses via Effective Feedback Compute&lt;/a&gt;, makes this point in research terms. The authors argue that agent harnesses scale less with raw tokens, tool calls, wall time, or cost, and more with how efficiently they convert raw budget into useful feedback.&lt;/p&gt;

&lt;p&gt;They call this &lt;strong&gt;Effective Feedback Compute&lt;/strong&gt;: feedback that is informative, valid, non-redundant, and retained for later decisions.&lt;/p&gt;

&lt;p&gt;That maps directly to coding agents.&lt;/p&gt;

&lt;p&gt;A test failure is useful only if the agent can understand it, trust it, avoid repeating it, and use it to change the next attempt.&lt;/p&gt;

&lt;p&gt;Useful backpressure has four properties:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Informative&lt;/td&gt;
&lt;td&gt;It tells the agent what failed and where&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Valid&lt;/td&gt;
&lt;td&gt;It comes from a trusted checker, test, tool, or observation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-redundant&lt;/td&gt;
&lt;td&gt;It adds signal instead of repeating noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retained&lt;/td&gt;
&lt;td&gt;It changes the agent’s next action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is why a thousand lines of logs can be worse than a short, structured failure.&lt;/p&gt;

&lt;p&gt;The goal is not more agent activity. The goal is more effective feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to implement it
&lt;/h2&gt;

&lt;p&gt;Start with the boring checks.&lt;/p&gt;

&lt;p&gt;Put the exact commands in &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, or the equivalent project instruction file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After changing TypeScript:
- run npm run typecheck
- run npm run lint
- run npm test -- --changed
- fix failures before opening a PR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then make the output efficient.&lt;/p&gt;

&lt;p&gt;Do not dump hundreds of lines of passing test output into the agent context. Passing checks should be tiny. Failing checks should show the useful detail.&lt;/p&gt;

&lt;p&gt;HumanLayer describes this as &lt;a href="https://www.humanlayer.dev/blog/context-efficient-backpressure" rel="noopener noreferrer"&gt;context-efficient backpressure&lt;/a&gt;: replace passing test, build, and lint output with a small success signal, but expose full output when a command fails.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ typecheck
✓ lint
✗ auth tests

FAIL auth/session.test.ts
Expected redirect to /login for expired session.
Received 200 from /dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is enough signal for the agent to continue.&lt;/p&gt;

&lt;p&gt;The rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Success should be compressed. Failure should be actionable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The trade-off
&lt;/h2&gt;

&lt;p&gt;Backpressure is not free.&lt;/p&gt;

&lt;p&gt;Fast sensors improve flow. Slow sensors choke it.&lt;/p&gt;

&lt;p&gt;Do not put every possible check inside the inner loop. Layer them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;In session:
typecheck, lint, focused tests, build, screenshots

Before PR:
full tests, integration tests, structural rules, security checks

Scheduled or explicit:
mutation testing, fuzzing, semantic evals, architecture drift review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Birgitta Böckeler’s &lt;a href="https://martinfowler.com/articles/sensors-for-coding-agents.html" rel="noopener noreferrer"&gt;Maintainability sensors for coding agents&lt;/a&gt; is useful here because it separates sensors that run during the coding session from sensors that belong in the pipeline, on a schedule, or in production.&lt;/p&gt;

&lt;p&gt;That is the right mental model: not every check belongs in the same loop.&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%2Frzeecotrsmwooiw3eowx.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%2Frzeecotrsmwooiw3eowx.png" alt="Backpressure Loops" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The inner loop should be fast enough that the agent can run it repeatedly. Slower checks belong outside the session unless the task is risky enough to justify the cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;When you correct the same agent mistake twice, turn it into backpressure.&lt;/p&gt;

&lt;p&gt;A test.&lt;br&gt;
A type.&lt;br&gt;
A linter rule.&lt;br&gt;
A build check.&lt;br&gt;
A browser assertion.&lt;br&gt;
A better error message.&lt;br&gt;
A small script the agent can run before it asks for review.&lt;/p&gt;

&lt;p&gt;The future skill is not asking agents to try harder.&lt;/p&gt;

&lt;p&gt;It is designing feedback loops that make bad output harder to accept.&lt;/p&gt;

&lt;p&gt;I write about similar AI-assisted coding patterns &lt;a href="https://generativeprogrammer.com/p/stop-babysitting-your-coding-agent" rel="noopener noreferrer"&gt;in my newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dapr as the Ultimate Microservices Patterns Framework</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Wed, 27 Sep 2023 09:06:20 +0000</pubDate>
      <link>https://dev.to/diagrid/dapr-as-the-ultimate-microservices-patterns-framework-20bj</link>
      <guid>https://dev.to/diagrid/dapr-as-the-ultimate-microservices-patterns-framework-20bj</guid>
      <description>&lt;p&gt;In the world of software development, microservices architecture stands out as the industry benchmark. This architectural style segments applications into distinct services, each deployable independently and organized around specific business capabilities. Such a design ensures flexibility, scalability, and resilience, with each service typically overseen by a specialized team. However, while this approach offers numerous benefits, it also introduces complexities. To navigate these challenges, developers turn to patterns, drawing parallels to time-tested design patterns from traditional software development, providing solutions for building robust distributed systems. For those seeking a comprehensive guide on these patterns, Chris Richardson’s &lt;a href="https://microservices.io/patterns/index.html" rel="noopener noreferrer"&gt;microservices.io&lt;/a&gt; stands as a trusted repository, rich with insights and best practices from industry experts.&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%2Feedd9afboxcjv3xznf5n.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%2Feedd9afboxcjv3xznf5n.jpeg" alt=" " width="800" height="622"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A pattern language for microservices by Chris Richardson&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;However, understanding patterns is just one part of the equation. Implementing them in real-world scenarios requires tools and frameworks. Positioned as a premier microservices chassis, &lt;a href="http://dapr.io/" rel="noopener noreferrer"&gt;Dapr&lt;/a&gt; is crafted for creating distributed applications that are secure, resilient, scalable, and observable. It doesn't merely align with the microservices patterns; it amplifies their potential, refining and simplifying their real-world implementation. &lt;/p&gt;

&lt;p&gt;In the subsequent sections, I'll go through the patterns outlined in microservices.io, shedding light on how Dapr helps implement each. While numerous frameworks aim to address the cross-cutting concerns inherent in microservices, Dapr distinguishes itself. Its polyglot nature, sidecar operational mode, and non-restrictive stance on application architecture make it a unique and invaluable asset in the microservices toolkit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microservice Chassis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When embarking on the development of an application, developers often find themselves investing significant time in addressing cross-cutting concerns such as security, externalized configuration, logging, health checks, metrics, and distributed tracing. While these elements might seem straightforward, defining a curated set of dependencies that will be used in tens or hundreds of services can be a complex endeavor. The challenge amplifies when adopting a microservices architecture, given the multitude of services and the frequent creation of new ones. The &lt;a href="https://microservices.io/patterns/microservice-chassis.html" rel="noopener noreferrer"&gt;Microservice Chassis&lt;/a&gt; pattern offers a solution by proposing the creation of a framework that serves as the foundation for microservices development. This chassis provides reusable build logic and mechanisms to handle these cross-cutting concerns, streamlining the development process.&lt;/p&gt;

&lt;p&gt;As a polyglot framework, Dapr seamlessly handles cross-cutting concerns, allowing developers to focus on core functionalities without getting entangled in complexities. It provides built-in mechanisms for security, configuration management, logging, and more. With features like the Access Control capabilities for security, Configuration API for externalized settings, and health API endpoints for monitoring, Dapr ensures that these foundational concerns are seamlessly integrated, allowing developers to focus on core business logic without getting mired in the intricacies of these concerns. Unlike other frameworks, Dapr doesn't impose constraints on the application, granting developers the freedom to choose their preferred language, runtime, and programming style. In essence, Dapr transforms the theoretical benefits of the Microservice Chassis pattern into tangible results for real-world applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sidecar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In microservices, there's often a need to augment services with additional capabilities without modifying the core service logic. The &lt;a href="https://microservices.io/patterns/deployment/sidecar.html" rel="noopener noreferrer"&gt;Sidecar pattern&lt;/a&gt; addresses this requirement. It involves deploying components of an application into separate processes or containers to provide a modular and scalable architecture. The main service runs in one container, and the sidecar service, which extends or enhances the main service, runs in a separate container but in the same network namespace. This ensures that the main service and the sidecar can communicate as if they are in the same process while being isolated from each other. The primary advantage of this pattern is the ability to separate concerns, modularize your application, and ensure that each component is focused on a specific responsibility.&lt;/p&gt;

&lt;p&gt;Dapr is among the most popular implementations of the Sidecar pattern. When integrated into a microservices environment, Dapr runs as a sidecar alongside your service, providing a plethora of additional capabilities without requiring any changes to the main service. This includes features like state management, service-to-service invocation, pub/sub messaging, and more. By leveraging Dapr's sidecar architecture, developers can augment their services with powerful features, ensuring a robust, scalable, and feature-rich microservices ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Mesh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the number of services grows, managing inter-service communication, security, and observability becomes increasingly complex. A Service Mesh is a dedicated infrastructure layer built to handle service-to-service communication in a transparent and technology-agnostic manner. It provides features like load balancing, service discovery, observability, and security without requiring changes to the application code. By offloading these concerns to the Service Mesh, developers can focus on building business logic, while the mesh ensures that services can securely and efficiently communicate with each other.&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%2Fja2mwgi1o8lmnzuli8wa.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%2Fja2mwgi1o8lmnzuli8wa.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How Dapr and service meshes compare&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr operates as a &lt;a href="https://docs.dapr.io/concepts/service-mesh/" rel="noopener noreferrer"&gt;lightweight service mesh&lt;/a&gt;, providing a network layer that facilitates service discovery and ensures secure service-to-service interactions. While there are overlapping capabilities between Dapr and traditional service meshes, Dapr distinguishes itself by being developer-centric, focusing on building blocks that simplify microservices development. Unlike service meshes which are primarily infrastructure-centric and deal with network concepts like IP and DNS addresses, Dapr offers service discovery and invocation via names, a more developer-friendly approach. Beyond the common features like mTLS encryption, metric collection, and distributed tracing, Dapr introduces application-level building blocks for state management, pub/sub messaging, actors, and more. This ensures that developers gain a comprehensive toolset, not just for networking, but for holistic microservices development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saga&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the world of microservices, ensuring data consistency across services can be a challenge, especially when each service has its own database. The Saga pattern provides a solution to this challenge. Instead of relying on traditional distributed transactions, the &lt;a href="https://microservices.io/patterns/data/saga.html" rel="noopener noreferrer"&gt;Saga pattern&lt;/a&gt; breaks the transaction into a series of local transactions, each executed within its own service and database. These local transactions are coordinated in a specific sequence to ensure overall data consistency. If one local transaction fails, compensating transactions are executed to revert the changes made by the previous transactions. This approach offers a way to maintain data consistency without the need for distributed transactions, which are often not feasible in microservices architectures.&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%2F4iu1ug9pew2vj7uht52s.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%2F4iu1ug9pew2vj7uht52s.png" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr workflow overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr offers a concrete solution to implement the Saga pattern through its Workflow API. This API allows developers to sequence local transactions, or implement other &lt;a href="https://www.diagrid.io/blog/in-depth-guide-to-dapr-workflow-patterns" rel="noopener noreferrer"&gt;stateful workflow patterns&lt;/a&gt; ensuring that data remains consistent across services. &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/workflow/workflow-overview/" rel="noopener noreferrer"&gt;Dapr Workflow API&lt;/a&gt; serves as a foundational tool in this regard, streamlining the process and ensuring reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transactional Outbox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In microservices architectures, a common challenge arises when a service command needs to update aggregates in the database and simultaneously send messages or events to a message broker. The goal is to ensure atomicity - if the database transaction commits, the messages must be sent; if the database rolls back, the messages must not be sent. Traditional distributed transactions (2PC) are often not feasible or desirable due to various constraints. The &lt;a href="https://www.infoq.com/articles/saga-orchestration-outbox/" rel="noopener noreferrer"&gt;Transactional Outbox&lt;/a&gt; pattern addresses this issue. It suggests that the service stores the message in the database as part of the transaction that updates the business entities. A separate process then retrieves and sends these messages to the message broker. This ensures that messages are sent only if the database transaction commits, preserving data consistency and order of operations.&lt;/p&gt;

&lt;p&gt;Dapr provides a robust solution to this challenge with its &lt;a href="https://github.com/dapr/dapr/issues/4233" rel="noopener noreferrer"&gt;Outbox feature&lt;/a&gt; in StateStore API. This feature allows for atomic updates to the database while also sending messages to the designated broker. By utilizing the StateStore API, developers can seamlessly integrate the Transactional Outbox pattern into their microservices, ensuring data consistency and reliable message delivery across large number of databases and message brokers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the realm of microservices, reliable asynchronous communication between services is paramount. Instead of services communicating directly with synchronous calls, they exchange messages via message channels. This &lt;a href="https://microservices.io/patterns/communication-style/messaging.html" rel="noopener noreferrer"&gt;asynchronous mode&lt;/a&gt; of communication decouples services, allowing them to operate independently. It ensures that even if one service is slow or unavailable, others can continue their operations without being directly affected. This approach enhances the system's resilience, scalability, and flexibility. &lt;/p&gt;

&lt;p&gt;Dapr's &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/pubsub/howto-publish-subscribe/" rel="noopener noreferrer"&gt;PubSub API&lt;/a&gt; is tailored to harness the power of asynchronous messaging for inter-service communication. By leveraging this API, developers can easily implement messaging patterns in their microservices architecture. The PubSub API ensures reliable message delivery, supports multiple messaging brokers, and abstracts the complexities of direct broker interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request/Reply Interaction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://microservices.io/patterns/communication-style/rpi.html" rel="noopener noreferrer"&gt;Remote Procedure Invocation&lt;/a&gt; (RPI) is a communication style that enables services in a microservices architecture to communicate with each other by invoking methods in a remote service. The primary advantage of RPI is its straightforwardness, allowing for direct, point-to-point communication between services. However, it's essential to manage the associated challenges, such as service discovery, reliability, encryption, to ensure the system remains resilient and secure.&lt;/p&gt;

&lt;p&gt;Dapr addresses the challenges with its &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/" rel="noopener noreferrer"&gt;Service Invocation API&lt;/a&gt;. This API provides an RPI-based protocol tailored for inter-service communication in a microservices setup. By abstracting the underlying complexities, Dapr ensures that services can communicate synchronously without getting entangled in the intricacies of direct service-to-service calls. Moreover, Dapr's Service Invocation API offers built-in features like retries, error handling, and traffic control, ensuring that communications are both reliable and secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a microservices architecture, services often collaborate to handle requests. However, when one service synchronously invokes another, there's a risk that the called service might be unavailable or might exhibit high latency, rendering it essentially unusable. Such scenarios can lead to resource exhaustion in the calling service, making it unable to handle other requests. This can further cascade the failure to other services throughout the application. The &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker" rel="noopener noreferrer"&gt;Circuit Breaker pattern&lt;/a&gt; addresses this challenge. It functions similarly to an electrical circuit breaker. When consecutive failures cross a certain threshold, the circuit breaker "trips." For a set timeout period, all attempts to invoke the problematic service fail immediately. After this period, the circuit breaker allows a few test requests. If these succeed, normal operation resumes; if not, the timeout period restarts.&lt;/p&gt;

&lt;p&gt;Dapr offers a concrete solution to this challenge with its &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/#resilience" rel="noopener noreferrer"&gt;Resiliency policy&lt;/a&gt;. This policy ensures that when the failure rate of a call exceeds a certain threshold, the call fails immediately, preventing resource exhaustion and potential cascading failures. By leveraging Dapr's resiliency policy, developers can implement the Circuit Breaker pattern efficiently, ensuring that their microservices architecture remains robust and resilient against unexpected service failures or latencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access Token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the intricate landscape of microservices, ensuring secure communication and access between services is paramount. The &lt;a href="https://microservices.io/patterns/security/access-token.html" rel="noopener noreferrer"&gt;Access Token pattern&lt;/a&gt; involves issuing tokens to clients, granting them limited access to a service. These tokens encapsulate the information required to determine whether a client is authorized to perform a given operation. The primary advantage of using access tokens is that they provide a way to ensure that only authenticated and authorized clients can access services or specific operations within those services. &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%2Fe6ivoxf3oet988fk46qx.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%2Fe6ivoxf3oet988fk46qx.png" alt=" " width="800" height="287"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr secure communications architecture&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr provides a robust mechanism to implement this pattern through its &lt;a href="https://docs.dapr.io/operations/configuration/invoke-allowlist/" rel="noopener noreferrer"&gt;Access Control&lt;/a&gt; capabilities based on &lt;a href="https://spiffe.io/" rel="noopener noreferrer"&gt;SPIFFE  Ids&lt;/a&gt;. With Dapr's Access Control, developers can define and enforce policies that restrict what operations calling applications can perform on the called app. This ensures a fine-grained control over service interactions, making the system more secure and resilient against potential threats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Instance per Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://microservices.io/patterns/deployment/service-per-container.html" rel="noopener noreferrer"&gt;Service Instance per Container pattern&lt;/a&gt; deployment strategy, places each service instance in its own container. Containers, being lightweight and isolated, provide an environment where the service can run with its dependencies, ensuring consistency across different stages of deployment. This approach offers several benefits: it ensures isolation, making each service instance independent of others; it provides scalability, as new instances can be spun up quickly; and it enhances &lt;a href="https://www.diagrid.io/blog/practical-portability-principles" rel="noopener noreferrer"&gt;portability&lt;/a&gt;, as each service containts its built-time dependencies.&lt;/p&gt;

&lt;p&gt;Dapr aligns perfectly with this deployment model as it  is designed to operate best in containerized environments. When a service is deployed with Dapr, a Dapr sidecar container runs alongside the service container, enhancing its capabilities without intruding into the service's operations. &lt;a href="https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-overview/" rel="noopener noreferrer"&gt;Dapr's deployment model&lt;/a&gt;, ensures that each service instance, along with its Dapr sidecar, remains isolated in its container, benefiting from the inherent advantages of the Service Instance per Container pattern such as scalable, and resilient microservices deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Instance per VM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In certain deployment scenarios, especially when dealing with large-scale applications or when containers might not be the optimal choice, deploying each service instance on its own Virtual Machine (VM) becomes a viable strategy. The &lt;a href="https://microservices.io/patterns/deployment/service-per-vm.html" rel="noopener noreferrer"&gt;Service Instance per VM pattern&lt;/a&gt; emphasizes this approach. By allocating a dedicated VM for each service instance, you ensure that the service has a dedicated set of resources, leading to predictable performance. This isolation also means that failures or resource contention in one service won't directly impact others. Moreover, VMs provide a higher degree of isolation compared to containers, which can be crucial for certain security or compliance requirements.&lt;/p&gt;

&lt;p&gt;Dapr is versatile and can be seamlessly deployed in a VM-based environment. Whether you're deploying Dapr on its own dedicated VM or using &lt;a href="https://github.com/dapr-sandbox/dapr-ambient" rel="noopener noreferrer"&gt;Dapr Ambient&lt;/a&gt; to share its capabilities among multiple Pods, Dapr ensures that microservices can communicate and operate efficiently. This flexibility means that developers aren't confined to containerized environments and can leverage Dapr's capabilities in VM-based deployments, ensuring that the benefits of Dapr, such as state management, service invocation, and pub/sub messaging, are available regardless of the deployment strategy. &lt;a href="https://docs.dapr.io/operations/hosting/" rel="noopener noreferrer"&gt;Dapr's deployment documentation&lt;/a&gt; provides insights into how it can be integrated into various environments, including VMs, or &lt;a href="https://twitter.com/daprdev/status/1529862546789785602" rel="noopener noreferrer"&gt;the real edge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Discovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In microservices architectures, the dynamic nature of service instances and their locations, especially in containerized environments, presents a challenge: how does a client of a service discover the location of a service instance? Two prevalent patterns address this challenge: &lt;a href="https://microservices.io/patterns/client-side-discovery.html" rel="noopener noreferrer"&gt;Client-side Discovery&lt;/a&gt; and &lt;a href="https://microservices.io/patterns/server-side-discovery.html" rel="noopener noreferrer"&gt;Server-side Discovery&lt;/a&gt;. The former involves clients querying a Service Registry to discover the current locations of service instances, ensuring they always communicate with available and healthy instances. On the other hand, the Server-side Discovery pattern simplifies client code by routing requests via a knowledgeable router, often a load balancer, which interacts with the service registry.&lt;/p&gt;

&lt;p&gt;Dapr's sidecar architecture adeptly addresses both these patterns. While the sidecar operates alongside a service, akin to a client, it isn't embedded within the application. This unique positioning allows it to query a service registry, discovering other service instances' locations, and also act as a router for inter-service calls. By offloading the intricacies of service discovery to the Dapr &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/" rel="noopener noreferrer"&gt;Service Invocation API&lt;/a&gt;, developers can ensure reliable service-to-service communication, even in environments where service locations change dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Registry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In dynamic microservices environments, the locations and number of service instances can frequently change. This poses a challenge: how can clients or routers be aware of the current available instances of a service? The &lt;a href="https://microservices.io/patterns/service-registry.html" rel="noopener noreferrer"&gt;Service Registry pattern&lt;/a&gt; offers a solution. It proposes a centralized registry where service instances register themselves upon startup and deregister upon shutdown. This registry acts as a database of services, their instances, and their locations. Clients or routers can then query this registry to discover the current locations of service instances. &lt;/p&gt;

&lt;p&gt;Dapr offers a seamless integration with the Service Registry concept, providing a unified interface to various service registry implementations. Dapr's pluggable &lt;a href="https://docs.dapr.io/reference/components-reference/supported-name-resolution/" rel="noopener noreferrer"&gt;name resolution&lt;/a&gt; components used in Service Invocation API cater to diverse hosting platforms, from Kubernetes, which utilizes its DNS service, to self-hosted machines using mDNS or even HashiCorp's Consul in varied environments. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self Registration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://microservices.io/patterns/self-registration.html" rel="noopener noreferrer"&gt;Self Registration pattern&lt;/a&gt; ensures that services can discover each other in  inter-service communication. When a service instance starts up, instead of relying on an external agent or system to register it with a service registry, the service instance itself takes the responsibility of registering. This ensures that the service registry always has the most up-to-date information about available service instances. By automating the registration process, the Self Registration pattern reduces manual intervention, potential errors, and ensures that the service registry is always current.&lt;/p&gt;

&lt;p&gt;When a service with a Dapr sidecar is deployed, the Dapr sidecar takes the initiative to register itself with the service registry. This automated process ensures that the service is immediately discoverable by other services in the ecosystem. This not only simplifies the deployment process but also enhances the reliability and efficiency of service-to-service communication in architectures built with Dapr.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3rd Party Registration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In some microservices architectures, not all services or endpoints are created or managed by the same team or entity. There might be third-party services or endpoints that need to be integrated into the system. These third-party services might not follow the same registration patterns as internal services. With the &lt;a href="https://microservices.io/patterns/3rd-party-registration.html" rel="noopener noreferrer"&gt;3rd Party Registration pattern&lt;/a&gt;, instead of the service registering itself (as in Self Registration), an external agent or system is responsible for registering the service with the service registry. This ensures that third-party services, which might not have the capability or permission to register themselves, are still discoverable and can be integrated seamlessly into the system.&lt;/p&gt;

&lt;p&gt;Dapr offers flexibility in this regard too. Even &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-non-dapr-endpoints/" rel="noopener noreferrer"&gt;non-Dapr 3rd party endpoints&lt;/a&gt; can be registered within the Dapr runtime, ensuring they benefit from service discovery, resiliency, and observability features that Dapr provides. This means that developers can integrate third-party services into their Dapr-enabled microservices architecture without those services being Dapr-aware. This allows a more cohesive and resilient microservices ecosystem, irrespective of the origin of the services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Externalized Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the world of microservices, applications often interact with various infrastructure and third-party services. Examples include service registries, message brokers, databases, payment processors, and more. A significant challenge arises when trying to ensure that a service can run across multiple environments (like dev, test, staging, production) without any modifications. The &lt;a href="https://microservices.io/patterns/externalized-configuration.html" rel="noopener noreferrer"&gt;Externalized Configuration pattern&lt;/a&gt; recommends externalizing all application configurations. This ensures that the service remains environment-agnostic and can adapt to different setups without any code changes.&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%2F8nhlz8oe3fpin93xrktk.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%2F8nhlz8oe3fpin93xrktk.jpeg" alt=" " width="799" height="486"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr secrets stores overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr provides a robust solution to this challenge with its &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/secrets/secrets-overview/" rel="noopener noreferrer"&gt;Secrets and Configuration APIs&lt;/a&gt;. These APIs allow developers to externalize configurations, including sensitive information like database credentials. Instead of hardcoding configurations or placing them in easily accessible files, Dapr ensures that they are securely stored and can be fetched dynamically when needed. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Health Check API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a microservices architecture, ensuring the health, availability, and self-healing of service instances is paramount. The &lt;a href="https://microservices.io/patterns/observability/health-check-api.html" rel="noopener noreferrer"&gt;Health Check API pattern&lt;/a&gt; proposes that each service should expose an API endpoint (e.g., HTTP /health) that indicates the health status of the service. This endpoint performs various checks, such as the status of connections to infrastructure services, the health of the host (e.g., disk space), and any application-specific logic. By periodically querying this endpoint, monitoring systems, service registries, or load balancers can determine the health of a service instance. This ensures that alerts are generated for unhealthy instances, and requests are only routed to healthy service instances, enhancing the reliability and efficiency of the system.&lt;/p&gt;

&lt;p&gt;Dapr elevates the health check pattern by conducting periodic health checks on your service, ensuring its optimal functioning. Once  &lt;a href="https://docs.dapr.io/operations/resiliency/health-checks/app-health/" rel="noopener noreferrer"&gt;app health checks&lt;/a&gt; are enabled, the Dapr sidecar routinely polls the application. If a health issue is detected, Dapr takes proactive measures: it unsubscribes from all pub/sub subscriptions, halts all input bindings, and short-circuits service-invocation requests, ensuring they aren't forwarded to the application. This comprehensive approach ensures that any potential issues are swiftly identified and mitigated, fostering a robust and resilient system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed Tracing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In complex microservices architectures, understanding the flow of requests across multiple services can be challenging. The &lt;a href="https://microservices.io/patterns/observability/distributed-tracing.html" rel="noopener noreferrer"&gt;Distributed Tracing pattern&lt;/a&gt; involves instrumenting services with code that assigns each external request a unique identifier. This identifier is then passed to all services involved in handling the request. By doing so, it becomes possible to trace the journey of a request across various services, recording information such as start time, end time, and other relevant metrics providing invaluable insights into the behavior of the system.&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%2Fs6243nigohsy948empa4.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%2Fs6243nigohsy948empa4.jpeg" alt=" " width="799" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr distributed tracing overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr automatically takes care of creating trace headers and ensures they are captured and forwarded appropriately. With Dapr’s &lt;a href="https://docs.dapr.io/operations/observability/tracing/tracing-overview/" rel="noopener noreferrer"&gt;observability capabilities&lt;/a&gt;, developers don't need to manually instrument their code for tracing; Dapr handles it seamlessly. Moreover, Dapr integrates with popular tracing systems, ensuring that the traces can be visualized and analyzed in a centralized manner. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://microservices.io/patterns/observability/application-metrics.html" rel="noopener noreferrer"&gt;Application Metrics&lt;/a&gt; are a set of quantitative data points that provide insights into the performance, behavior, and health of an application or service. By collecting and analyzing these metrics, developers and operations teams can identify bottlenecks, detect anomalies, and optimize the performance of their services, enabling proactive monitoring and ensuring optimal system health.&lt;/p&gt;

&lt;p&gt;Dapr automatically gathers a wide range of &lt;a href="https://docs.dapr.io/operations/observability/metrics/metrics-overview/" rel="noopener noreferrer"&gt;networking metrics&lt;/a&gt;, capturing data related to request rates, error rates, and latency, among others. Dapr ensures that these metrics are delivered to a centralized metrics service, allowing for comprehensive monitoring and analysis. This means that developers and operations teams can have a unified view of the system's performance, irrespective of the number of services or their complexity. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serverless Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the evolving landscape of software development, the need for scalable, and cost-effective deployment solutions is growing. &lt;a href="https://microservices.io/patterns/deployment/serverless-deployment.html" rel="noopener noreferrer"&gt;Serverless Deployment&lt;/a&gt; refers to a deployment infrastructure that abstracts away any concept of servers, be it physical, virtual hosts, or containers. The primary advantage is that developers can focus solely on their code, without concerning themselves with the underlying infrastructure. The serverless platform automatically scales services based on the load, ensuring optimal resource utilization.&lt;/p&gt;

&lt;p&gt;Dapr is gearing up for the &lt;a href="https://www.diagrid.io/blog/evolution-of-cloud-computing" rel="noopener noreferrer"&gt;serverless era&lt;/a&gt; too. Soon, developers will be able to access Dapr's rich capabilities as serverless APIs. This means that the vast array of features Dapr offers, from state management to messaging, will be available in a serverless context, ensuring developers get the best of both worlds. By integrating Dapr into serverless environments, developers can ensure more robust, scalable, and feature-rich applications without the complexities of managing the Dapr infrastructure. For the updates on this pattern, follow &lt;a href="https://twitter.com/diagridio" rel="noopener noreferrer"&gt;@diagridio&lt;/a&gt; on Twitter and you can be among the first to try it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Patterns play a pivotal role in software development, serving as a shared language to communicate common challenges and best practices. They encapsulate proven solutions to recurring problems, ensuring that developers don't have to reinvent the wheel with each new project. However, while patterns provide a conceptual blueprint, they remain abstract ideas. Historically, the challenges of building reliable applications and the implementations of these patterns were addressed using application servers, service buses, and microservices frameworks like Spring Cloud, among other language-specific solutions. But to truly bring these patterns to life in the modern era, we need cloud-native frameworks and chassis like Dapr. Dapr tackles these common engineering challenges by presenting patterns as polyglot APIs, aligning with the cloud-native philosophy and &lt;a href="https://www.diagrid.io/blog/dapr-as-a-10x-platform" rel="noopener noreferrer"&gt;offering benefits&lt;/a&gt; to the whole organization. This ensures that developers can leverage best practices across multiple languages and platforms, streamlining the development process and enhancing application resilience and scalability.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Top 20 Must-Read Software Trends Reports for 2023</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Thu, 20 Jul 2023 09:14:09 +0000</pubDate>
      <link>https://dev.to/diagrid/top-20-must-read-software-trends-reports-for-2023-2bf3</link>
      <guid>https://dev.to/diagrid/top-20-must-read-software-trends-reports-for-2023-2bf3</guid>
      <description>&lt;p&gt;In the rapidly evolving software industry, keeping up with new trends, tools, and best practices can be time-consuming. With so much information available, where do you start, and what sources can you trust? I've curated a list of reports that I follow to stay informed and ahead of the curve. These provide insights into everything from programming languages to DevOps, cloud strategy, and security. If you're interested in the latest trends and fascinating posts I come across, &lt;a href="https://twitter.com/bibryam" rel="noopener noreferrer"&gt;follow me&lt;/a&gt; or check out my latest writing on industry trends over at the Diagrid &lt;a href="https://www.diagrid.io/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt;. I share anything I find insightful and worth reading in the world of cloud and distributed systems. &lt;/p&gt;

&lt;p&gt;Here are the top 20 reports for 2023 (in no particular order) I came across so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.tiobe.com/tiobe-index/" rel="noopener noreferrer"&gt;Programming Community Index for June 2023 - TIOBE
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redmonk.com/sogrady/2023/05/16/language-rankings-1-23/" rel="noopener noreferrer"&gt;Programming Language Rankings - January 2023 - RedMonk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://survey.stackoverflow.co/2023/" rel="noopener noreferrer"&gt;Developer Survey 2023 - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/articles/cloud-devops-trends-2023/" rel="noopener noreferrer"&gt;DevOps and Cloud Trends Report – July 2023 - InfoQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/podcasts/architecture-trends-report-2023/" rel="noopener noreferrer"&gt;Software Architecture &amp;amp; Design Trends 2023 - InfoQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/" rel="noopener noreferrer"&gt;State of the API Report 2023 - Postman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datadoghq.com/state-of-application-security/" rel="noopener noreferrer"&gt;State of Application Security Report 2023 - DataDog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/radar/platforms/dapr" rel="noopener noreferrer"&gt;Technology Radar Vol 28 - Thoughtworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learning.oreilly.com/library/view/radar-trends-to/9781098156527/ch01.html" rel="noopener noreferrer"&gt;Radar Trends to Watch: June 2023 - O'Reilly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hashicorp.com/state-of-the-cloud" rel="noopener noreferrer"&gt;State of Cloud Strategy Survey 2023 - HashiCorp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/en/resources/state-kubernetes-security-report-2023" rel="noopener noreferrer"&gt;State of Kubernetes Security Report 2023 - Red Hat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.puppet.com/resources/state-of-platform-engineering" rel="noopener noreferrer"&gt;The State of Platform Engineering Report - PuppetLabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tanzu.vmware.com/content/ebooks/stateofkubernetes-2023" rel="noopener noreferrer"&gt;State of Kubernetes 2023 - Vmware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deno.com/blog/state-of-edge-functions-2023" rel="noopener noreferrer"&gt;The State of Edge Functions 2023 - Deno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://state-of-data.com/" rel="noopener noreferrer"&gt;State of Data 2023 - AirByte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.databricks.com/discover/state-of-data-ai" rel="noopener noreferrer"&gt;State of Data + AI 2023 - Databricks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://octoverse.github.com/" rel="noopener noreferrer"&gt;The State of Open Source Software 2022 - Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stateofapis.com/" rel="noopener noreferrer"&gt;State of APIs 2022 - RapidAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cncf.io/reports/cncf-annual-survey-2022/" rel="noopener noreferrer"&gt;CNCF Annual Survey 2022 - CNCF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/products/devops-sre/dora-2022-accelerate-state-of-devops-report-now-out" rel="noopener noreferrer"&gt;State of DevOps Report 2022 - Google&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While these reports offer valuable insights, it's important to keep in mind that they can be opinionated. The key to effectively leveraging these resources lies in cross-verifying trends from multiple sources and using them only as a guide for direction rather than absolute truths. &lt;/p&gt;

&lt;p&gt;Are there any reports that should be on this list? Tag me on Twitter and I'll include them, subject to my checks  I'm always keen to explore new sources! Found this list helpful? Go ahead, &lt;a href="https://twitter.com/intent/tweet?text=Top%2020%20Must-Read%20Software%20Trends%20Reports%20by%20%40bibryam&amp;amp;url=https%3A%2F%2Fwww.ofbizian.com%2F2023%2F07%2Ftop-20-must-read-software-reports.html" rel="noopener noreferrer"&gt;share it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Call to action: Are you a &lt;a href="https://dapr.io/" rel="noopener noreferrer"&gt;Dapr&lt;/a&gt; user? Your experience is valuable! Contribute your insights and shape the &lt;a href="https://22146261.hs-sites.com/state-of-dapr-2023-survey?utm_medium=social&amp;amp;utm_source=twitter" rel="noopener noreferrer"&gt;State of Dapr Report&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>cloud</category>
      <category>kubernetes</category>
      <category>data</category>
    </item>
  </channel>
</rss>
