<?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: Svetlana Perekrestova</title>
    <description>The latest articles on DEV Community by Svetlana Perekrestova (@sperekrestova).</description>
    <link>https://dev.to/sperekrestova</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3776559%2Fb078b8e0-b0f8-457d-a493-2593fe93f3bd.png</url>
      <title>DEV Community: Svetlana Perekrestova</title>
      <link>https://dev.to/sperekrestova</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sperekrestova"/>
    <language>en</language>
    <item>
      <title>Why 'Brownfield' Deployments Break Agent Architectures — Lessons from Google</title>
      <dc:creator>Svetlana Perekrestova</dc:creator>
      <pubDate>Sat, 21 Mar 2026 23:50:01 +0000</pubDate>
      <link>https://dev.to/sperekrestova/why-brownfield-deployments-break-agent-architectures-lessons-from-google-g21</link>
      <guid>https://dev.to/sperekrestova/why-brownfield-deployments-break-agent-architectures-lessons-from-google-g21</guid>
      <description>&lt;p&gt;Last week I attended &lt;a href="https://cloudonair.withgoogle.com/events/ai-agents-reloaded-live-labs-benelux" rel="noopener noreferrer"&gt;Google AI Agents Reloaded Live Labs Benelux&lt;/a&gt; and ended up winning in the &lt;strong&gt;"Agents for Good"&lt;/strong&gt; track. 🎉&lt;/p&gt;

&lt;p&gt;Between lab sessions and back-to-back talks, I filled several pages of notes — and a lot of it challenged or refined assumptions I had about building agents. This isn't a recap of "what is an AI agent." It's the non-obvious stuff: where the real traps are, what the data actually says, and which design decisions have outsized consequences in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  First: the honest framing for 2026
&lt;/h2&gt;

&lt;p&gt;The production track opened with this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If 2025 was the year of the agent, 2026 is the year of making it work."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Followed immediately by a slide that just read: &lt;strong&gt;"Reality check: it's all brownfield."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No one is deploying agents into pristine infrastructure built from scratch. They go into existing systems, legacy APIs, organizational processes, and teams that were never designed for autonomous AI. That constraint changes almost every architectural decision — and it's the lens through which everything else in this article should be read.&lt;/p&gt;




&lt;h2&gt;
  
  
  The A2A Protocol — and why the streaming part matters
&lt;/h2&gt;

&lt;p&gt;Google's &lt;strong&gt;Agent-to-Agent (A2A)&lt;/strong&gt; protocol is a standardized, framework-agnostic way for agents to discover each other, communicate, and delegate tasks. The spec is clean, but the interesting design decisions are in the details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discovery via Agent Cards
&lt;/h3&gt;

&lt;p&gt;Remote agents advertise their capabilities at a well-known endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/agent-card.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the agent's capability manifest — it declares name, description, URL, version, skills, and supported content types. A client agent fetches this &lt;em&gt;before&lt;/em&gt; sending any task. It's roughly the AI equivalent of an OpenAPI spec, but for autonomous agents rather than REST endpoints.&lt;/p&gt;

&lt;p&gt;An Agent Card definition in code looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;agent_card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Currency Agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Helps with exchange rates for currencies&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.0.0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;default_input_modes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CurrencyAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SUPPORTED_CONTENT_TYPES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;default_output_modes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CurrencyAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SUPPORTED_CONTENT_TYPES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;skills&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The communication model: Messages, Tasks, Artifacts
&lt;/h3&gt;

&lt;p&gt;All communication happens over &lt;strong&gt;JSON-RPC over HTTP(S)&lt;/strong&gt;. The core data structures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Message&lt;/strong&gt; — has a &lt;code&gt;role&lt;/code&gt; (user or agent) and one or more &lt;code&gt;Parts&lt;/code&gt; (text, file, or JSON)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Task&lt;/strong&gt; — returned by the server agent with an &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;status&lt;/code&gt; for async tracking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Artifact&lt;/strong&gt; — the final output payload, also structured as Parts&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;Agent Executor&lt;/strong&gt; sits inside the server-side agent and handles incoming messages, runs the internal reasoning loop, and emits responses back to the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Polling is explicitly an anti-pattern
&lt;/h3&gt;

&lt;p&gt;This was called out directly in the session: polling &lt;code&gt;task.status&lt;/code&gt; over HTTP for long-running tasks is inefficient. You're hammering an endpoint waiting for a status change when the server could simply tell you when it's done.&lt;/p&gt;

&lt;p&gt;The right mechanism is &lt;strong&gt;SSE (Server-Sent Events)&lt;/strong&gt; — the server agent pushes updates (initial task acknowledgment, intermediate messages, final artifacts) over a persistent HTTPS connection. You declare support in the agent card with &lt;code&gt;streaming: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For multi-step agentic workflows where the client (or an orchestrating parent agent) needs to react to intermediate outputs, this isn't optional. Polling at scale compounds into latency and unnecessary infrastructure load.&lt;/p&gt;

&lt;h3&gt;
  
  
  A2A vs MCP — complementary, not competing
&lt;/h3&gt;

&lt;p&gt;This distinction came up several times across talks and labs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;: connects an agent to &lt;em&gt;tools&lt;/em&gt; — APIs, functions, data sources. It defines the agent↔tool interface. Primitives are Tools, Resources, and Prompts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A2A&lt;/strong&gt;: connects &lt;em&gt;agents to agents&lt;/em&gt;. Full task delegation between autonomous agents that each have their own reasoning loops, tools, and memory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A well-designed multi-agent system uses both: MCP for tool access within an agent, A2A for coordination across agent boundaries. The live demo showed a &lt;a href="https://github.com/MKand/agenticprotocols" rel="noopener noreferrer"&gt;reference implementation&lt;/a&gt; worth looking at if you're planning a multi-agent architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evaluating agents properly — this section deserves its own article
&lt;/h2&gt;

&lt;p&gt;The evaluation talk (by Naz Bayrak from Google) was the most practically useful session of the day. The field underinvests here, and it shows.&lt;/p&gt;

&lt;h3&gt;
  
  
  You need to evaluate two dimensions, not one
&lt;/h3&gt;

&lt;p&gt;Every agent run produces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Final response&lt;/strong&gt; — did the agent achieve the goal? Is the output correct and useful?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trajectory&lt;/strong&gt; — what path did it take? Which tools were called, in what order?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Evaluating only the output misses an entire category of bugs: agents that arrive at correct-looking answers via wrong reasoning, agents that take five steps when two suffice, agents that call the wrong tool but recover via hallucination. These bugs surface reliably under slightly different inputs — and you won't know they exist until they do.&lt;/p&gt;

&lt;h3&gt;
  
  
  The three evaluation methods and their actual tradeoffs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Strengths&lt;/th&gt;
&lt;th&gt;Weaknesses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Human evaluation&lt;/td&gt;
&lt;td&gt;Captures nuance, human factors, trust signals&lt;/td&gt;
&lt;td&gt;Subjective, slow, expensive, doesn't scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM-as-a-Judge&lt;/td&gt;
&lt;td&gt;Scalable, consistent, automated&lt;/td&gt;
&lt;td&gt;Bounded by the judge model's capability ceiling; misses complex intermediate steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated metrics&lt;/td&gt;
&lt;td&gt;Objective, deterministic, fits in CI&lt;/td&gt;
&lt;td&gt;Can't measure creativity or complex reasoning; susceptible to gaming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these is sufficient alone. The pattern that works in production is layered: automated metrics catch regressions at scale, LLM-as-Judge handles qualitative assessment, human evaluation validates the trust signals that automation can't quantify.&lt;/p&gt;

&lt;h3&gt;
  
  
  Six trajectory metrics — and which to use when
&lt;/h3&gt;

&lt;p&gt;ADK provides six distinct strategies for comparing an agent's actual trajectory against a "golden run":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exact match&lt;/strong&gt; — perfect replication required (strictest)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;In-order match&lt;/strong&gt; — correct steps in the correct order, extra steps allowed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Any-order match&lt;/strong&gt; — correct steps in any order, extra steps allowed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Precision&lt;/strong&gt; — how relevant/correct are the predicted actions?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recall&lt;/strong&gt; — how many required actions were actually captured?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single-tool use&lt;/strong&gt; — did the agent use a specific tool at least once?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choosing wrong matters. &lt;strong&gt;Any-order match&lt;/strong&gt; makes sense when steps are genuinely parallelizable. &lt;strong&gt;In-order match&lt;/strong&gt; is right when sequence is semantically meaningful — a lookup must precede a write, a validation must precede a commit. &lt;strong&gt;Precision vs. recall&lt;/strong&gt; is the classic tradeoff: optimize for precision when false positives are costly, recall when missing required steps is the bigger risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM-as-a-Judge: how to structure the rubric
&lt;/h3&gt;

&lt;p&gt;The pattern that works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"You are an impartial AI quality analyst. Rate the following response
on a scale of 1-5 for [criterion].
Does the response [specific check]?
Explain your reasoning."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output — structured JSON, not prose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groundedness_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The response accurately reflects the source document and makes no unsupported claims."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ground truth (a reference answer) is recommended but not required. Without it, scores are less reliable — include it whenever you have it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two case studies worth unpacking
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Case Study 1: Multi-agent retail pricing system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Challenge: validate a system where three agents (Data, Action, Forecasting) had to collaborate correctly. The final output alone wasn't enough to trust — if the orchestrator called agents in the wrong order, outputs could look plausible while the underlying process was broken.&lt;/p&gt;

&lt;p&gt;Three-layer evaluation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trajectory testing (pytest-automated)&lt;/strong&gt;: confirmed the orchestrator called the right agents in the right order. Tests verified that data queries started with &lt;code&gt;transfer_to_agent('DataAgent')&lt;/code&gt; — catching internal process errors even when final outputs looked fine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLM-as-Judge with custom rubric&lt;/strong&gt;: scored final responses on "Business Clarity" and "Conciseness" — qualitative, business-relevant criteria that no automated metric captures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rubric decomposition for stress testing&lt;/strong&gt;: for complex multi-constraint prompts, one LLM generated a checklist of all constraints the response should satisfy; a second LLM gave binary Yes/No answers per item. Explainable, detailed failure analysis rather than a single opaque score.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Key learning: &lt;em&gt;For multi-agent back-end systems, the process is the product. Trajectory correctness must be validated before output quality — a correct-looking answer via a wrong path is a bug, not a success.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Case Study 2: Customer-facing software assistant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Challenge: technical accuracy wasn't enough — the agent needed to be genuinely helpful and feel trustworthy to real users.&lt;/p&gt;

&lt;p&gt;Strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-simulated conversations&lt;/strong&gt;: a "Simulated IT Pro" LLM dynamically generated realistic multi-turn dialogues, creating a large test dataset without expensive human annotation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expert Evaluator LLM&lt;/strong&gt;: scored transcripts on helpfulness and task adherence, providing a quantitative baseline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"Vibes-based" human testing&lt;/strong&gt;: domain experts interacted directly with the agent and provided qualitative feedback on whether guidance &lt;em&gt;felt right&lt;/em&gt; in real-world context — the thing automated systems can't capture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured human evaluation&lt;/strong&gt;: 1-5 scoring forms with free-form notes, identifying nuance and domain-specific errors the LLM judge missed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Key learning: &lt;em&gt;Automation provides scale; it doesn't provide trust. For user-facing agents, qualitative domain-expert signal isn't optional — it's the thing you're ultimately optimizing for.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Evaluation is a loop, not a gate
&lt;/h3&gt;

&lt;p&gt;The four-stage continuous evaluation cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code &amp;amp; Build&lt;/strong&gt; — validate logic before anything runs in production&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality &amp;amp; Behavior Eval&lt;/strong&gt; — pre-deployment testing of intelligence and behavior&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Release &amp;amp; Live&lt;/strong&gt; — real users generate real data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Observe, Analyze, Capture&lt;/strong&gt; — production insights update golden datasets for the next iteration&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Production interactions are your richest source of new test cases. Teams that close this loop improve continuously. Teams that treat evaluation as a pre-ship gate plateau.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agentic memory — full context is not the answer
&lt;/h2&gt;

&lt;p&gt;This was the most empirically grounded section of the whole conference, and it directly challenged a common default.&lt;/p&gt;

&lt;h3&gt;
  
  
  The accuracy data
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No memory&lt;/td&gt;
&lt;td&gt;10.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full context (all history)&lt;/td&gt;
&lt;td&gt;55.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Competing memory offering&lt;/td&gt;
&lt;td&gt;63.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reflective Memory Bank (RMB)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74.6%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full context &lt;em&gt;underperforms&lt;/em&gt; selective memory. There are two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: full context processes all history every request; selective memory retrieves only the relevant subset.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context rot&lt;/strong&gt;: as irrelevant history accumulates in the context window, LLM output quality degrades systematically — the "lost in the middle" effect. The model's attention is diluted across noise.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The implication runs counter to the intuition that "more context = better": &lt;em&gt;giving the model less but more relevant information outperforms giving it everything.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Two distinct memory layers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sessions (short-term memory)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent Engine is inherently stateless — it doesn't store anything between calls. Sessions is the layer that adds statefulness. It stores conversation history, agent actions, and state &lt;em&gt;within&lt;/em&gt; a single session, and eliminates the need to manage your own conversation history database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Bank (long-term memory)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Memory Bank persists facts &lt;em&gt;across&lt;/em&gt; multiple sessions, linked to a specific &lt;code&gt;userId&lt;/code&gt;. After each session ends, an LLM automatically extracts key facts from the conversation and stores them. Retrieval is similarity-based (semantic search) or by userId lookup. The extraction happens server-side, invisible to the user.&lt;/p&gt;

&lt;p&gt;Sessions and Memory Bank are independent — you can use either or both.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Reflective Memory Management actually works
&lt;/h3&gt;

&lt;p&gt;RMM (from &lt;a href="https://arxiv.org/pdf/2503.08026" rel="noopener noreferrer"&gt;Google Research, arXiv:2503.08026&lt;/a&gt;) is the underlying mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prospective Reflection&lt;/strong&gt;: after a session ends, the system decomposes the dialogue by topic, summarizes key facts, and stores or merges them into the bank&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retrospective Reflection&lt;/strong&gt;: before responding to a new query, retrieves potentially relevant topic summaries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptive Reranking&lt;/strong&gt;: a learnable module (trained via RL on LLM citation behavior) refines the Top-K retrieved memories to the Top-M most relevant — this is the key differentiator from naive vector similarity search&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wiring it up
&lt;/h3&gt;

&lt;p&gt;With ADK, &lt;code&gt;PreloadMemoryTool&lt;/code&gt; handles the full lifecycle — finding memories at session start, injecting them into context, and telling Memory Bank to learn from the session when it ends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MODEL_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;helpful_assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant with perfect memory.
        - Use the context to personalize responses
        - Naturally reference past conversations when relevant
        - Build upon previous knowledge about the user&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;adk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preload_memory_tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PreloadMemoryTool&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;runner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;app_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;session_service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;VertexAiSessionService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LOCATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_engine_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent_engine_id&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;memory_service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;VertexAiMemoryBankService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LOCATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_engine_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent_engine_id&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For non-ADK frameworks (LangGraph, CrewAI), Memory Bank exposes a direct API with &lt;code&gt;generate_memories&lt;/code&gt; and &lt;code&gt;retrieve_memories&lt;/code&gt; — same capabilities, more manual wiring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agents in production: what changes at scale
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The "agentic drift" problem
&lt;/h3&gt;

&lt;p&gt;As agent autonomy increases, SRE and ops teams face a new operational discipline: &lt;strong&gt;agentic drift&lt;/strong&gt; — when agent behavior gradually diverges from intended behavior in production without clear error signals. Agents may continue producing plausible-looking outputs while quietly drifting from their intended goals. This is harder to detect than traditional software failures, where errors are usually explicit.&lt;/p&gt;

&lt;p&gt;The 5% of complex, novel outages that AI cannot self-resolve become the critical escalation path for human operators.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI improves individuals but increases delivery instability
&lt;/h3&gt;

&lt;p&gt;Survey data from the conference: &lt;strong&gt;85% of respondents report AI has increased their individual productivity&lt;/strong&gt; (13% extremely, 31% moderately, 41% slightly). But the measured organizational-level effects showed &lt;strong&gt;software delivery instability as the highest-impact negative outcome&lt;/strong&gt; of AI adoption.&lt;/p&gt;

&lt;p&gt;Individual speed gains don't automatically propagate to team or organizational outcomes. The gap between "I'm faster" and "we ship better" is where governance and process come in — and it's not a gap most teams are deliberately closing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two strategic frames worth keeping
&lt;/h3&gt;

&lt;p&gt;The most useful mental model from the whole event:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent as Actor&lt;/strong&gt; (done &lt;em&gt;by&lt;/em&gt; agents): agents build and operate things autonomously — dev automation, code generation, orchestration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent as Artifact&lt;/strong&gt; (done &lt;em&gt;to&lt;/em&gt; agents): agents are platform components that must be deployed, scaled, secured, governed, observed, and optimized.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams invest heavily in the first and underinvest in the second. Production failures tend to originate in the second.&lt;/p&gt;




&lt;h2&gt;
  
  
  The design principles I'm keeping
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Evaluate trajectories, not just outputs.&lt;/strong&gt; A correct answer reached by an incorrect path is a bug waiting to surface on the next slightly different input. Trajectory evaluation is not optional — it's the signal that output evaluation misses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory architecture is a first-class design decision.&lt;/strong&gt; The choice between in-context history, Sessions, and Memory Bank has measurable accuracy and cost implications. The 20-point accuracy gap between full context and RMB is large enough to matter in production. It's not an implementation detail you optimize later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming over polling.&lt;/strong&gt; SSE-based push vs. HTTP polling is the difference between a responsive and a broken UX for any long-running agent task. Design for it upfront.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evaluation is a loop.&lt;/strong&gt; Pre-deployment evals catch known issues. Production observation discovers the unknown unknowns. The feedback loop between production traces and golden datasets is where agents actually improve over time — and it needs to be built deliberately, not added retroactively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design for brownfield.&lt;/strong&gt; The clean-room version of an agentic system is a prototype. The real one integrates with what already exists. Every architectural decision should be stress-tested against that constraint.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Based on notes from&lt;/em&gt; &lt;a href="https://cloudonair.withgoogle.com/events/ai-agents-reloaded-live-labs-benelux" rel="noopener noreferrer"&gt;&lt;em&gt;Google AI Agents Reloaded Live Labs Benelux&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. A2A demo code:&lt;/em&gt; &lt;a href="https://github.com/MKand/agenticprotocols" rel="noopener noreferrer"&gt;&lt;em&gt;github.com/MKand/agenticprotocols&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Memory research:&lt;/em&gt; &lt;a href="https://arxiv.org/pdf/2503.08026" rel="noopener noreferrer"&gt;&lt;em&gt;arXiv:2503.08026&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Closing the onboarding gap: a framework for Backend Engineers</title>
      <dc:creator>Svetlana Perekrestova</dc:creator>
      <pubDate>Mon, 16 Feb 2026 23:35:09 +0000</pubDate>
      <link>https://dev.to/sperekrestova/closing-the-onboarding-gap-a-framework-for-backend-engineers-13jg</link>
      <guid>https://dev.to/sperekrestova/closing-the-onboarding-gap-a-framework-for-backend-engineers-13jg</guid>
      <description>&lt;p&gt;After seven years in enterprise software engineering, I've noticed a pattern that almost every team repeats, regardless of company size or how mature its engineering culture is. There's always a company-level onboarding program — an HR portal, a welcome deck, a compliance module. And there's usually a team-level checklist — maybe a Confluence space, some wiki pages, a screen recording of someone clicking through the product. But there's a gap between those two things that almost nobody fills deliberately, and it quietly destroys the first few months of every new hire.&lt;/p&gt;

&lt;p&gt;That gap is the &lt;em&gt;ways-of-working&lt;/em&gt; layer: all the micro-decisions and conventions that live inside your team but rarely get written down properly. And closing it is one of the highest-leverage things a senior engineer can do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unveiling the hidden knowledge: bridging the onboarding gap
&lt;/h2&gt;

&lt;p&gt;When I join a new team, I can usually find documentation about &lt;em&gt;what&lt;/em&gt; the product does. What I can't find — or find only in fragmented, outdated form — is &lt;em&gt;how work moves through the team&lt;/em&gt;: what a Git branch should be named, what the PR approval flow looks like, which Jira statuses map to which stages, whether the QA engineer writes the automation tests or whether I do, and where those tests even live.&lt;/p&gt;

&lt;p&gt;This knowledge exists. It's just distributed across the heads of your team members, not written anywhere accessible. New engineers discover it incrementally, as friction, every time they touch a task.&lt;/p&gt;

&lt;p&gt;The documentation that does exist usually has one of three problems. It's stale — written when the process was different and never updated, which makes it actively misleading. It's generic — written for the "standard" flow (new feature delivery) with no mention of edge cases like patching a previous version or handling a hotfix. Or it's scoped to a different team — written by a neighbouring squad whose conventions diverge from yours in ways that aren't immediately obvious.&lt;/p&gt;

&lt;p&gt;None of this is negligence. It's just that keeping documentation current competes with shipping features, and documentation always loses that race unless someone makes it a priority.&lt;/p&gt;




&lt;h2&gt;
  
  
  The critical impact of effective onboarding on Engineer performance
&lt;/h2&gt;

&lt;p&gt;Most companies measure new hires against some form of probation or ramp-up evaluation. Managers assess how quickly an engineer starts delivering meaningful output: merging PRs, closing tickets, moving features toward production. The expectation is reasonable — you were hired to ship.&lt;/p&gt;

&lt;p&gt;But delivery is blocked by process comprehension. Until a newcomer understands &lt;em&gt;how&lt;/em&gt; work flows through your team, they can't move fast, no matter how technically skilled they are. A senior engineer who joins a large enterprise with tightly coupled but independently managed departments can spend their entire probation period just figuring out who owns what and what sequence of steps gets a task to production. That's not a reflection of their ability — it's a structural failure of the onboarding process.&lt;/p&gt;

&lt;p&gt;I've seen genuinely strong engineers underperform in their first review cycle for exactly this reason. And I've come to believe that the first two to three weeks of onboarding have an outsized, durable effect on how quickly — and how confidently — someone integrates into a team.&lt;/p&gt;




&lt;h2&gt;
  
  
  The two-week framework
&lt;/h2&gt;

&lt;p&gt;What follows is the framework I've built and refined across multiple teams and companies. It assumes you're the senior engineer assigned as the newcomer's onboarding buddy. If no one has been assigned that role explicitly, volunteer for it anyway — it pays back in team throughput within weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1, days 1–2: environment and access
&lt;/h3&gt;

&lt;p&gt;Don't underestimate this phase. Getting local environment, VPN, repository access, and IDE configuration working correctly always takes longer than expected, especially in enterprise environments with SSO, custom Maven/Gradle configurations, corporate certificate authorities, or internal artifact registries. Allocate real time for it, be available for troubleshooting, and don't let a newcomer burn their first two days feeling blocked and embarrassed to ask for help.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1, days 3–5: Ways-of-Working walkthrough
&lt;/h3&gt;

&lt;p&gt;This is the most critical session in the entire onboarding. I run it live, sharing my screen, walking through a complete example of how a piece of work moves from backlog to production. Not in slides — in the actual tools we use.&lt;/p&gt;

&lt;p&gt;Concretely, I cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jira workflow&lt;/strong&gt;: how to pick up a ticket, what each status means, when to transition it, and when (and whether) to reassign it to QA for automation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git branching strategy&lt;/strong&gt;: how we name branches, what prefixes we use, what the branching model is (trunk-based, GitFlow, something in between)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pull request process&lt;/strong&gt;: how many approvals are required, who reviews what, what "done" looks like before you request review, and any automated checks that must pass&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing requirements&lt;/strong&gt;: which types of tests are expected (unit, integration, contract), what the coverage threshold is if one exists, and how to run them locally&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI/CD pipelines&lt;/strong&gt;: which pipelines exist (build, test, deploy, release), which run automatically and which require manual trigger, what parameters are needed, where build artifacts land, and what artifact registry we use&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I deliberately show all of this on screen. Words are ambiguous; a live walkthrough of the actual Jenkinsfile or GitHub Actions workflow removes ambiguity. I also stop to answer every question as it comes up, because questions during this session surface gaps in your own documentation that you'll want to fix later.&lt;/p&gt;

&lt;p&gt;After the session, I send a follow-up message with links to every tool, page, and resource I mentioned — a curated reference list, not a dump of the entire Confluence tree.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1, days 5+: codebase deep-dive
&lt;/h3&gt;

&lt;p&gt;Once the process is clear, I move to the code itself. I pull a real task from the top of the backlog, assign it to the newcomer, and then walk them through how I would approach starting it — again on screen.&lt;/p&gt;

&lt;p&gt;This covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Service structure and module layout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where the relevant domain logic lives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to find which service owns a given piece of behaviour (important in microservices environments)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to run the service locally, including any pre-run steps that aren't integrated into the IDE run configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to run the test suite, and any environment setup required before tests will pass locally&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What to do if there's no clear task description — who to ask, what questions to ask them&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last point matters more than most onboarding documentation acknowledges. Incomplete tickets are normal, and knowing how to resolve ambiguity productively is a skill that needs to be explicitly modelled, not left to the newcomer to figure out on their own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 2: supported independence
&lt;/h3&gt;

&lt;p&gt;By the start of the second week, the newcomer should be working independently on their first task. Your job shifts from teaching to being reliably available. Answer questions quickly, review their PR thoroughly and constructively, and stay alert to signs that they're stuck on process rather than on a genuinely hard technical problem — those two things look similar from the outside but require very different responses.&lt;/p&gt;

&lt;p&gt;Resist the urge to go quiet because they seem to be making progress. A quick daily check-in for the second week costs you ten minutes and prevents a lot of silent confusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture diagram nobody draws
&lt;/h2&gt;

&lt;p&gt;If you're working in a complex microservices environment — multiple services, event-driven communication, shared infrastructure components — take thirty minutes during the first week to draw a simplified architecture diagram together with the newcomer. It doesn't need to be beautiful. A whiteboard photo, a quick Miro sketch, or even a PlantUML diagram is fine.&lt;/p&gt;

&lt;p&gt;The goal isn't completeness. It's orientation. Without a visual anchor, engineers in large systems spend weeks building a mental model that could be handed to them in half an hour. That's a straightforward win that almost never happens because no one prioritises it.&lt;/p&gt;

&lt;p&gt;If your team doesn't have an architecture overview document, creating one during onboarding is a good forcing function. The newcomer's questions will tell you exactly what was missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;Onboarding rarely gets the engineering rigour it deserves. The irony is that the investment is small and the return is significant: two focused weeks of structured knowledge transfer meaningfully accelerates a newcomer's ramp-up, reduces the noise that slows down the rest of the team, and increases the likelihood that a strong engineer survives their probation period and stays.&lt;/p&gt;

&lt;p&gt;In my experience, it doesn't matter how large the company is or how well-documented its processes are at the macro level. Team-level onboarding is almost always underdeveloped. The engineers who make it a priority — who treat it as a real engineering problem worth solving deliberately — build better teams faster. That's worth the calendar time.&lt;/p&gt;

</description>
      <category>career</category>
      <category>management</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
