<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Google Cloud - Community - Medium]]></title>
        <description><![CDATA[A collection of technical articles and blogs published or curated by Google Cloud Developer Advocates. The views expressed are those of the authors and don&#39;t necessarily reflect those of Google. - Medium]]></description>
        <link>https://medium.com/google-cloud?source=rss----e52cf94d98af---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Google Cloud - Community - Medium</title>
            <link>https://medium.com/google-cloud?source=rss----e52cf94d98af---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 20 Jun 2026 16:27:45 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/google-cloud" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Anthropic Just Gave Agents ‘Dreams.’ Here’s How to Build Your Own on Google Cloud]]></title>
            <link>https://medium.com/google-cloud/anthropic-just-gave-agents-dreams-here-s-how-to-build-your-own-on-google-cloud-e509b0e1e6ba?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/e509b0e1e6ba</guid>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[anthropic-claude]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Qingyue(Annie) Wang]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 04:59:36 GMT</pubDate>
            <atom:updated>2026-06-20T04:59:35.427Z</atom:updated>
            <content:encoded><![CDATA[<p><em>This is Part 4 of a five-part series on building an AI agent with reflective memory on Google Cloud, from the core concept to a verified implementation.</em></p><p><strong>TL;DR:</strong> Anthropic’s <a href="https://platform.claude.com/docs/en/managed-agents/dreams">Dreams</a> lets a managed agent sleep on past sessions and wake up with cleaner memory. On Google Cloud, you can build the same pattern yourself: keep the live session as evidence, let <a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/scale/memory-bank">Memory Bank</a> remember the user, let a <a href="https://docs.cloud.google.com/run/docs/create-jobs">Cloud Run Job</a> reflect on completed task trajectories, store the lessons in <a href="https://firebase.google.com/docs/firestore">Firestore</a>, and retrieve both before the next action.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B71cLze93NYbJIthotvgyw.png" /></figure><p>Anthropic recently gave managed agents a way to <strong>sleep on it</strong>. With <strong>Dreams</strong>, Claude reviews past sessions and an agent’s existing memory while the agent is idle, then produces a cleaner memory store for future sessions: duplicates merged, stale facts updated, contradictions resolved, and new patterns added.</p><p>That is a catchy product feature, but the architecture lesson is bigger than the product:</p><blockquote><em>The agent works now. The harness reflects later. The next action starts with better memory.</em></blockquote><p>This post builds that pattern on Google Cloud with components you own: Memory Bank, Firestore, embeddings, and a scheduled Cloud Run Job. There is one important difference from Anthropic’s managed Dreams: their feature curates a memory store from past sessions, while this architecture splits memory into two jobs:</p><ul><li><strong>learn the user:</strong> derive durable user facts from conversations;</li><li><strong>learn the job:</strong> derive reusable lessons from completed task trajectories.</li></ul><p>Both are reflective memory. They just run over different evidence.</p><h3>The architecture</h3><p>Dana opens a support ticket:</p><blockquote><em>The billing page will not load.</em></blockquote><p>To answer well, the agent needs two different memories. It needs to remember <strong>Dana</strong>: she is an administrator at ACME, on the Enterprise plan, and prefers concise troubleshooting. It also needs to remember <strong>the job</strong>: similar “page will not load” tickets often turn out to be missing roles, so permissions should be checked before generic browser advice.</p><p>Those memories come from different places, on different timelines:</p><ul><li>the user facts come from conversations;</li><li>the job lesson comes from a completed support trajectory;</li><li>the current ticket lives in the active session.</li></ul><p>The architecture is:</p><blockquote><strong><em>Keep the live session as evidence. Write user facts and job lessons through separate reflection paths. Retrieve both into one scoped context before the agent acts.</em></strong></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gzx1Q34DzuEljiQHSBKvwQ.png" /></figure><p>The database choices matter less than the separation of responsibilities:</p><ul><li><a href="https://cloud.google.com/sql?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Cloud-SS-DR-GCP-1713658-GCP-DR-NA-US-en-Google-SKWS-BRO-CloudSQL&amp;utm_content=c-Hybrid+%7C+SKWS+-+BRO+%7C+Txt-Databases-Relational+DB-Cloud+SQL-300297442532&amp;utm_term=cloud%20sql&amp;gclsrc=aw.ds&amp;gad_source=1&amp;gad_campaignid=23762517050&amp;gclid=CjwKCAjw0dPRBhAPEiwAE5vTTvNRqNmGC3hNOsW2Z7tqVl_AzjASlzLZZq3oCWAkAfpAgYbrMWnp8xoCBLUQAvD_BwE"><strong>Cloud SQL</strong></a><strong> or managed Sessions</strong> keeps the active conversation durable.</li><li><a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/scale/memory-bank"><strong>Memory Bank</strong></a> manages user-facing long-term memory.</li><li><a href="https://firebase.google.com/docs/firestore"><strong>Firestore</strong></a> stores trajectories and derived job lessons.</li><li><a href="https://docs.cloud.google.com/run/docs/create-jobs"><strong>Cloud Run Job</strong></a> runs the offline reflection process.</li><li><strong>A recall tool</strong> merges scoped user facts and job lessons at runtime.</li></ul><p>That is the harness doing memory.</p><h3>Start with evidence, not memory</h3><p>The live session is not long-term memory. It is evidence: messages, tool calls, intermediate state, and outcomes. ADK represents this through a SessionService; in production, that should be durable rather than in-memory.</p><p>This distinction prevents the common mistake:</p><blockquote><em>A persisted transcript is not the same thing as useful memory.</em></blockquote><p>A transcript records what happened. Reflective memory records what the system learned from what happened, so the harness keeps the session and derives smaller memory artifacts from it.</p><h3>Write path one: Memory Bank remembers the user</h3><p>The first write path is the managed one. At a deliberate lifecycle point, the application sends relevant conversation events to <strong>Memory Bank</strong>, which can generate and consolidate durable user facts under identity scope.</p><p>For Dana, that might become:</p><pre>Dana is an administrator at ACME.<br>ACME is on the Enterprise plan.<br>Dana prefers concise troubleshooting steps.</pre><p>This path matters because the final recall step needs user context, but it is not the hard part of this post. The harder part is the second write path: teaching the agent from completed work.</p><h3>Write path two: the agent learns the job</h3><p>The second reflection path begins after a task finishes. Suppose the support agent first suggests clearing the browser cache. That fails. Later, an account check finds the real cause: Dana is missing the billing role.</p><p>The harness records a structured trajectory:</p><pre>agent_id: support_agent<br>user_id: dana<br>task: billing page will not load<br>actions: [suggest cache clear, check account, check billing role]<br>outcome: resolved<br>root_cause: missing billing role</pre><p>The most important field is the <strong>outcome</strong>.</p><p>Without the outcome, reflection tends to produce vague advice like “diagnose the issue carefully.” With the root cause and resolution, reflection can produce a reusable lesson:</p><pre>For permission-gated pages, verify account status and resource roles<br>before generic browser troubleshooting.</pre><p>This is why the trajectory store should not be a raw transcript dump. It should record enough structure for later reflection to know what actually worked. In this architecture, the trajectory is written to <strong>Firestore</strong> and marked processed: false, which turns Firestore into the dream job&#39;s work queue.</p><h3>The dream is a scheduled reflection job</h3><p>The dream is the background process that turns completed trajectories into reusable job memory. Technically, it is a <strong>Cloud Run Job</strong> triggered by <strong>Cloud Scheduler</strong>. It does not serve live HTTP traffic; it starts, processes a batch, writes derived memories, and exits.</p><p>The job:</p><ol><li>reads unprocessed trajectories;</li><li>selects the ones worth reflecting on;</li><li>asks Gemini to derive a lesson or procedure;</li><li>validates the result and applies scope;</li><li>embeds the approved memory;</li><li>writes it back to Firestore for retrieval;</li><li>marks the source trajectory as processed.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sKc6MjWxEH0QSyJIOWIhsw.png" /></figure><p>Scheduled reflection is a design choice, not a law. If an agent needs to retry immediately, reflection may happen synchronously between attempts. For many systems, though, batch reflection is better: it keeps expensive reasoning off the live path, supports consolidation, and gives you a place for review, confidence checks, and expiry.</p><p>Every derived lesson should keep:</p><ul><li>its source trajectory;</li><li>its scope;</li><li>its confidence or review status;</li><li>its expiry or freshness policy.</li></ul><p>That traceability matters because a reflective system can preserve a wrong conclusion as faithfully as a correct one.</p><h3><a href="https://ai.google.dev/gemini-api/docs/embeddings">Embeddings</a> make lessons usable later</h3><p>Future tickets will not repeat the exact same words. “Billing page is blank,” “I cannot open invoices,” and “the page will not load” may all need the same permissions-first procedure, so the dream embeds the approved lesson and stores the vector in Firestore. At retrieval time, the harness embeds the current query and uses Firestore vector search to find nearby lessons.</p><p>The durable rule is simple:</p><blockquote><em>Store and query with the same embedding model, task convention, and vector dimensions.</em></blockquote><p>The specific model can change. The architectural responsibility does not.</p><h3>Read path: merge facts and lessons before acting</h3><p>When Dana opens the next ticket, the agent should not choose between user memory and job memory. It needs both, and a custom recall tool can query both stores:</p><pre>async def recall(query, tool_context):<br>    user_facts = await tool_context.search_memory(query)<br>    job_lessons = search_job_memory(query, scope=current_scope)<br>    return {<br>        &quot;user_facts&quot;: user_facts,<br>        &quot;job_lessons&quot;: job_lessons,<br><br>    }</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xnVt1s_cn35i8ax-qx1vqA.png" /></figure><p>Memory Bank returns context about Dana. Firestore returns the permissions-first lesson. The tool formats both into one scoped payload:</p><pre>Customer context:<br>Dana is an Enterprise administrator at ACME.</pre><pre>Relevant job lesson:<br>For permission-gated pages, verify account status and resource roles<br>before generic browser troubleshooting.</pre><p>Now the agent can make a better first move:</p><blockquote><em>Let me check your billing role before we try browser troubleshooting.</em></blockquote><p>This does not guarantee success. It changes the starting point, which is what reflective memory is supposed to do.</p><p>One implementation note matters: this is a composition pattern, not a special built-in ADK multi-store abstraction. ADK can wire Memory Bank as the memory service, but the Firestore lesson lookup is owned by your custom tool. Filtering, ranking, scoping, and formatting are harness responsibilities.</p><p>One guardrail matters here: similar does not mean allowed. A lesson can be relevant and still belong to the wrong user, tenant, or agent, so the recall tool should enforce scope before returning anything. Private memories stay private, agent-domain lessons stay within their domain, and shared lessons require stronger review. Do that filtering in the query and tool layer, not after the model has already seen the memory.</p><h3>The loop you are building</h3><p>The whole architecture has one rhythm:</p><ol><li>The live session records what happens.</li><li>Memory Bank derives approved user facts.</li><li>Firestore records completed task trajectories and outcomes.</li><li>The dream derives scoped job lessons.</li><li>Retrieval merges facts and lessons before the next action.</li><li>The next action becomes new evidence.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OhJ4HAMbQEUL_lfqjidVVg.png" /></figure><p>The stack can change, the model can change, and the schedule can change. The durable design is the separation of evidence, derived knowledge, scope, and retrieval.</p><p>That is the build-your-own version of agent Dreams: not a hidden product feature, but a harness pattern you can inspect, govern, and verify. The final post turns this architecture into a build and proves that memory actually changes the agent’s next decision.</p><p><em>This is Part 4 of a five-part series on building an AI harness with reflective memory on Google Cloud.</em></p><p><strong>Next: Part 5 — </strong>Vibe Code Your Own Agent ‘Dreams’ in Antigravity</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e509b0e1e6ba" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/anthropic-just-gave-agents-dreams-here-s-how-to-build-your-own-on-google-cloud-e509b0e1e6ba">Anthropic Just Gave Agents ‘Dreams.’ Here’s How to Build Your Own on Google Cloud</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Cloud Tetris: A Technical Deep Dive into GCP Sole-Tenant Node Usage Optimization]]></title>
            <link>https://medium.com/google-cloud/the-cloud-tetris-a-technical-deep-dive-into-gcp-sole-tenant-node-usage-optimization-4572d3802dea?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/4572d3802dea</guid>
            <category><![CDATA[cloud-cost-optimization]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[cloud-optimization]]></category>
            <category><![CDATA[infrastructure]]></category>
            <category><![CDATA[google-compute-engine]]></category>
            <dc:creator><![CDATA[Dwij Sheth]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 04:59:29 GMT</pubDate>
            <atom:updated>2026-06-20T04:59:28.524Z</atom:updated>
            <content:encoded><![CDATA[<p>Authored by: <a href="https://medium.com/u/646d7f1814b3">Dwij Sheth</a> &amp; <a href="https://medium.com/u/ebd99c72cb4d">Vinay Damle</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*z3zVc_BmpfXBHv0b0Y609Q.png" /></figure><p>The cloud is built on the promise of elasticity, but certain workloads demand dedicated hardware for strict compliance, licensing restrictions, or absolute performance isolation. In Google Cloud Platform (GCP), this is achieved using <a href="https://docs.cloud.google.com/compute/docs/nodes/sole-tenant-nodes"><strong>Sole-Tenant Nodes</strong></a>.</p><p>However, moving to dedicated hardware brings back a physical constraint: you pay for the entire server node you provision, regardless of whether you are utilizing 1% or 100% of its capacity.</p><p>Imagine you operate a massive fleet of cargo ships (Sole-Tenant Nodes) carrying shipping containers (Virtual Machines). Managing this fleet effectively means playing a high-stakes game of Tetris on the open ocean:</p><ul><li>You pay the fuel and crew costs for a ship whether it is fully loaded or carrying just two containers.</li><li>As workloads are spun up and destroyed over time, your cargo capacity becomes highly fragmented with scattered gaps.</li><li>To drastically reduce costs, you must perfectly pack the remaining cargo so you can send empty ships back to port.</li></ul><p>Google Cloud provides powerful primitives like Sole-Tenant Nodes and seamless Live Migration that empower teams to build highly customized orchestrators. Here is a technical deep-dive into how we built an automated Sole Tenancy Node Optimizer, creating a digital “harbor master” to play and win this game of Cloud Tetris.</p><h3>Orchestrating Live Migrations: <em>Transferring Cargo at Sea</em></h3><p>In traditional logistics, transferring heavy containers between ships requires halting operations and docking at a port. In the cloud, halting an enterprise system is simply not an option; applications must remain completely online.</p><p>Google Cloud’s <a href="https://cloud.google.com/compute/docs/instances/live-migration"><strong>Live Migration</strong></a> feature acts as our mid-ocean transfer mechanism, allowing us to move workloads without disrupting the fleet:</p><ul><li><strong>Pre-Copy Phase:</strong> The hypervisor iteratively copies the VM’s active memory pages from the source ship (node) to the destination ship, meticulously tracking any memory changed during the transfer.</li><li><strong>Blackout Phase:</strong> Once the memory states are nearly synchronized, the VM is paused for just milliseconds to transfer the final state and device registers.</li><li><strong>Resumption:</strong> The VM resumes execution on the new hardware seamlessly, completely unaware it has been moved.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/880/1*tWiAFvWzbEc-OBmZk2bBlg.png" /></figure><p>While this process is incredibly robust, it carries a time cost. A single Live Migration typically takes <strong><em>minutes</em></strong> to complete from start to finish. Because moving a single container takes minutes, sequential moves across a massive fleet would take days. To rapidly consolidate the fleet, our harbor master needed a highly efficient, automated strategy to move dozens of containers simultaneously.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sjNCXJajBx2kWkptgIItdg.png" /></figure><h3>The Algorithm: Greedy Drain and Best-Fit Packing</h3><p>We structured the orchestration engine around a four-step continuous loop: <strong>Discover State, Analyze &amp; Plan, Live Migrate, and Refine</strong>. But the core intelligence lies in the planning phase, where the harbor master executes a <strong>Greedy Drain</strong> algorithm.</p><p>To maximize the number of empty ships we can decommission, the engine follows two strict rules:</p><ul><li><strong>Candidate Selection (The Greedy Drain):</strong> The engine actively searches for the “emptiest ships” first sorting source nodes by minimum instance count and minimum utilization. These are the easiest to completely clear out.</li><li><strong>Destination Selection (Best-Fit):</strong> Instead of spreading containers evenly, the engine force-packs cargo into the destination ships that are <em>already</em> the fullest (sorting by maximum utilization).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DjU6fG8LyWaiDDkxghAhVA.png" /></figure><p>This logic quickly maximizes ships sitting at 100% capacity. But as any Tetris player knows, if you drop the wrong pieces early on, you create unfillable gaps later.</p><h3>Preventing Physical Fragmentation: Large-VM Prioritization</h3><p>Even with the Greedy Drain strategy, a new physical constraint emerged. If our automated cranes grabbed the smallest containers (e.g., 2-vCPU VMs) first, they would scatter them across the destination ships, filling up random deck slots.</p><p>Later, when the crane attempts to load a massive 32-vCPU database VM, no single ship has enough total capacity left to hold it even if the combined free capacity across the entire fleet added up to hundreds of vCPUs. To prevent this, we implemented strict <strong>Large-VM Prioritization</strong>:</p><ul><li>Before execution, the entire migration plan is sorted by VM size (vcpu and memory_mb) in descending order.</li><li>The massive, oversized containers are assigned to destination ships first, ensuring the bulk capacity is reserved for them.</li><li>Only then are the smaller crates loaded, which safely consume whatever fractional capacity is left over on the ships.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7TJthW-3sEdGBR_GCZ7TuA.png" /></figure><p>With the sorting logic perfected to avoid fragmentation, we fired up the automated cranes. However, running this at scale introduced a dangerous race condition on the docks.</p><h3>The Dynamic Port: Managing Capacity Collisions</h3><p>While our automated cranes are busy moving containers, the port remains open for normal business. The cloud is a dynamic environment, which introduces a new problem: unexpected double-booking.</p><ul><li>Our optimizer discovers 16 vCPUs of available space on “Ship A” and schedules a crane to move a container there.</li><li>Before the crane can finish the move, a new container (an external workload from an autoscaler or developer) arrives at the port. The main GCP office immediately books it into that exact space on Ship A.</li><li>When our crane finally attempts to drop its load, the GCP API rejects the move with a 412 PRECONDITION FAILED (Insufficient Capacity) error.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*akkSnylpx5kuae3xK9NXdw.png" /></figure><p>Additionally, our own parallel cranes might try to claim the same space simultaneously. To prevent our own system from causing these collisions, we introduced an in-memory <strong>Resource Reservation System</strong>. When a thread plans a migration, it instantly deducts the reserved_vcpu from the destination node&#39;s simulated free pool so other threads don&#39;t double-book it.</p><p>However, we still needed a robust way to handle collisions caused by those unpredictable, external workloads.</p><h3>Self-Healing State: The Multi-Pass Architecture</h3><p>When a capacity collision occurs, the crane simply drops the container back onto the source ship. Rather than building a brittle, globally locked harbor schedule to prevent every possible external conflict, we designed the engine to embrace the dynamic nature of the cloud using a resilient <strong>Multi-Pass Architecture</strong>:</p><ul><li><strong>Execute the Pass:</strong> The engine lets the entire first optimization pass execute completely. The vast majority of parallel migrations succeed, but unpredictable external workloads might cause a few collisions.</li><li><strong>The Refine Loop:</strong> Rather than halting the port or throwing a fatal error, the engine finishes its first pass and then automatically begins a fresh “Refine Loop.”</li><li><strong>Re-Evaluate and Retry:</strong> It fetches the newly updated, post-collision state of the entire fleet, discovers which destination ships actually have real capacity remaining, and launches a second sweeping pass to route any stranded cargo to new open slots.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tm0y_t23aT4conrTJlM89A.png" /></figure><p>This self-healing loop elegantly resolves capacity conflicts on the fly, ensuring that the fleet is fully optimized without needing to pause external cloud traffic. However, while the destination ships were now protected and resilient, the sheer volume of concurrent moves accidentally threatened to capsize the source ships.</p><h3>Hardware Strain: Enforcing Source-Node Parallelism</h3><p>While optimizing the destination, we inadvertently created a massive bottleneck on the source ships.</p><p>If the engine identified a source ship with 50 small containers and commanded 50 cranes to unload it simultaneously, the physical hardware strained under the load. Overwhelming the underlying hypervisor’s management plane and I/O during Live Migration risks host stability. You simply cannot attach fifty cranes to a single small vessel without capsizing it.</p><p>To mitigate this, we throttled the system using <strong>Source-Node Parallelism Limits</strong>:</p><ul><li>Instead of using a global free-for-all thread pool, the engine assigns dedicated ThreadPoolExecutors per physical source node.</li><li>We enforce a strict concurrency cap, allowing a maximum of <strong>3 active Live Migrations</strong> originating from a single source host at any given time.</li></ul><p>The throttles kept the physical hardware perfectly stable, but the open sea remains unpredictable. We still needed a way to handle sudden manifest changes mid-flight.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g3eqVlxKtkKWTHduO_B6Tw.png" /></figure><h3>Conclusion: Winning the Cloud Tetris Game</h3><p>Automating cloud efficiency requires treating infrastructure as a dynamic logistics puzzle that must account for mathematical bin-packing, concurrency safety, and the absolute physical limits of the underlying hardware.</p><p>By combining the power of GCP Live Migration with a Greedy Drain algorithm, strict resource locking, and source-node parallelism constraints, we transformed a fragmented fleet of servers into a highly dense compute environment:</p><ul><li>CPU and RAM packing efficiencies climbed dramatically across our active nodes.</li><li>Dozens of emptied ships were successfully returned to port.</li><li>By eliminating wasted capacity, our overall dedicated compute costs plummeted.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WYz0wHK2H5Q13u-2vgrHGA.png" /></figure><p>With Google Cloud’s powerful architectural primitives like Live Migration, even the strictest dedicated hardware environments can achieve true cloud elasticity ensuring our enterprise customers always operate at peak performance and minimal cost.</p><p><strong>The puzzle never really ends.</strong></p><p>While our greedy-drain algorithm solved our immediate density challenges, the cloud is always evolving. How is your engineering team handling the physical constraints of dedicated compute? Have you built your own custom orchestrators, or do you rely entirely on out-of-the-box scheduling policies?</p><p>We’d love to hear your approach to solving these hardware puzzles at scale. Drop a comment below or connect with us on LinkedIn: <a href="https://www.linkedin.com/in/dwij28/"><strong>Dwij Sheth</strong></a>, <a href="https://www.linkedin.com/in/damlevinay/"><strong>Vinay Damle</strong></a> to keep the conversation going!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4572d3802dea" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/the-cloud-tetris-a-technical-deep-dive-into-gcp-sole-tenant-node-usage-optimization-4572d3802dea">The Cloud Tetris: A Technical Deep Dive into GCP Sole-Tenant Node Usage Optimization</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OpenGravity: Turn Antigravity into your autonomous cloud agent, controlled from WhatsApp]]></title>
            <link>https://medium.com/google-cloud/opengravity-turn-antigravity-into-your-autonomous-cloud-agent-controlled-from-whatsapp-df6cc8b84404?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/df6cc8b84404</guid>
            <category><![CDATA[autonomous-agent]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[google-antigravity]]></category>
            <dc:creator><![CDATA[Stéphane Giron]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 04:59:13 GMT</pubDate>
            <atom:updated>2026-06-20T04:59:12.065Z</atom:updated>
            <content:encoded><![CDATA[<p><em>A hands-on guide to deploying your own AI assistant on a cloud VM, powered by Antigravity 2.0 and accessible from anywhere through WhatsApp.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w22atMZWn0dJCbIWdvje5Q.png" /></figure><h3>From Hermes to Antigravity</h3><p>A few days ago, I published a <a href="https://medium.com/google-cloud/deploying-hermes-ai-agent-and-webui-on-gcp-a-step-by-step-hands-on-guide-ee32303c4bfb">step-by-step guide on deploying the Hermes AI agent on GCP</a>. The experience was genuinely exciting, having an autonomous agent running on a cloud VM, accessible through WhatsApp, felt like a glimpse into the future of how we’ll work with AI.</p><p>But as much as I enjoyed Hermes, something kept pulling me back. I’m a fan of <strong>Antigravity 2.0</strong>. Its deep integration with the development workflow, its ability to read, write, execute, and reason across an entire codebase, nothing else comes close for me. As a <strong>Google Developer Expert</strong> working for a Google reseller, Antigravity is genuinely the tool I use more and more for coding but also for performing analysis and various tasks.</p><p>So the question became obvious: <strong>why switch to an external agent platform when I could bring the power of Antigravity itself to the cloud?</strong></p><p>That’s how <strong>OpenGravity</strong> was born.</p><blockquote>The repository is public and available here: <a href="https://github.com/St3ph-fr/OpenGravity">github.com/St3ph-fr/OpenGravity</a></blockquote><h3>Why this matters: The real benefits</h3><p>Before we dive into the setup, let me share why this architecture is genuinely compelling, going far beyond just “it’s cool.”</p><h4>🌍 Your Agent, Everywhere</h4><p>With Antigravity running on a cloud VM and OpenGravity bridging it to WhatsApp, your agent becomes <strong>omnipresent</strong>. Waiting for a train? Ask it to check the status of a deployment. At lunch? Have it research a technical topic and summarize findings. In a meeting? Quickly trigger a script on your dev environment.</p><p>You don’t need a laptop; you don’t need SSH. You just text it.</p><h4>💰 Cost-Effective: Use Your Existing Subscription</h4><p>This is a detail that matters a lot in practice. When you use Antigravity through OpenGravity, <strong>you consume your AI Pro subscription quota</strong>, not per-token API charges. If you’re already paying for an AI Pro subscription, this is essentially “free” compute intelligence on top of a small VM cost. No surprise bills; no token counting.</p><h4>🔒 A Safe Sandbox for Your Agent</h4><p>Here’s something I learned from the Hermes deployment: having an agent run on a <strong>dedicated cloud VM</strong> is actually a significant safety advantage. The agent can freely execute commands, write files, install packages, compile code, and if anything goes wrong, it’s contained to that VM. Your personal machine stays untouched. The VM is disposable; that’s a real benefit when you’re letting an autonomous agent run tasks.</p><h4>✋ You Stay in Control</h4><p>Even though the agent runs autonomously, OpenGravity includes a <strong>human-in-the-loop approval system</strong>. When the agent wants to execute a sensitive command, it pauses and sends you a WhatsApp message asking for permission. You reply with a thumbs up 👍 or thumbs down 👎. Simple, fast, and secure.</p><h4>📺 Demo</h4><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FviwHfdyF8z4%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DviwHfdyF8z4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FviwHfdyF8z4%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/63d4fa47e31a9a7578a8c7054ad0edc6/href">https://medium.com/media/63d4fa47e31a9a7578a8c7054ad0edc6/href</a></iframe><h3>OpenGravity, setup guide</h3><h4>Step 1: Set up your cloud VM</h4><p>If you followed my <a href="https://medium.com/google-cloud/deploying-hermes-ai-agent-and-webui-on-gcp-a-step-by-step-hands-on-guide-ee32303c4bfb">previous article on deploying Hermes on GCP</a>, the foundation is exactly the same. You need a Linux VM running on a cloud provider.</p><p><strong>What you need:</strong></p><ul><li>A <strong>GCP Compute Engine</strong> instance (or equivalent on AWS/Azure)</li><li>Recommended machine type: <strong>e2-medium</strong> (2 vCPUs, 4 GB RAM), which is sufficient for Antigravity and the WhatsApp bridge</li><li><strong>OS</strong>: Ubuntu 22.04 LTS or Debian 12</li><li><strong>Estimated cost</strong>: ~$25–35/month for an always-on instance</li></ul><p>I won’t repeat the full VM creation steps here; the <a href="https://medium.com/google-cloud/deploying-hermes-ai-agent-and-webui-on-gcp-a-step-by-step-hands-on-guide-ee32303c4bfb">Hermes guide</a> covers the GCP setup in detail (creating the instance, firewall rules, SSH access). Follow those steps to get your VM up and running, then come back here.</p><h4>Step 2: Install Antigravity 2.0 on Linux</h4><p>Once your VM is ready, head to the official download page: <a href="https://antigravity.google/download"><strong>antigravity.google/download</strong></a></p><p>Follow the Linux installation instructions on that page. The installation will set up:</p><ul><li>The Antigravity CLI and agent runtime</li><li>The agentapi binary, which is used by OpenGravity to communicate with agent sessions</li><li>The configuration directory at ~/.gemini/config/</li></ul><p>After installation, verify everything is working:</p><pre>antigravity --version</pre><p>Launch Antigravity in the interface and authenticate with your Google account when prompted. This is where your AI Pro subscription comes in, as the agent will use your subscription quota, not pay-per-token billing.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SAmbZpK4OqgRxcxZgY71kA.png" /><figcaption>Antigravity on Linux VM hosted on Google Cloud Platform</figcaption></figure><h4>Step 3: Install OpenGravity: Let the agent handle the setup</h4><p>Here is where the magic of Antigravity 2.0 comes in. Instead of walking you through copy-pasting code block by code block, we are going to let Antigravity set up the entire integration itself.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JEmtzjatXHwhN_cvklDcSw.png" /><figcaption>GitHub repository OpenGravity</figcaption></figure><p>By using Antigravity to perform the setup, we also create a dedicated project. This centralizes all the files and configurations, making it extremely easy to manage, update, and extend the project in the future.</p><h4>Launch and Prompt the Agent</h4><p>Open the Antigravity 2.0 application on your machine (or start it via the terminal with the antigravity command). Create a new project for OpenGravity, and then prompt the agent with the following:</p><pre>I want to set up the OpenGravity WhatsApp bridge sidecar and plugin. Here is the repository: https://github.com/St3ph-fr/OpenGravity.<br>Please clone it and follow the README to set up the sidecar files and the plugin configurations. I want to use pairing code authentication instead of QR code scanning for convenience, and my WhatsApp phone number is +33XXXXXXXXX.</pre><p>The agent will read the repository code and automatically execute the required actions:</p><ol><li>Clone the repository into your project space.</li><li>Copy the bridge sidecar files (bridge.js, sidecar.json, package.json) to the correct Antigravity sidecar directory at ~/.gemini/config/sidecars/whatsapp-bridge/.</li><li>Run npm install inside the sidecar folder to pull in all dependencies (like @whiskeysockets/baileys).</li><li>Copy the plugin/skill configuration files to your plugins folder at ~/.gemini/config/plugins/opengravity/.</li><li>Register the whatsapp-bridge sidecar in your global ~/.gemini/config/config.json file.</li><li>Configure the WHATSAPP_PHONE_NUMBER environment variable in the run configuration.</li></ol><h4>WhatsApp Pairing Code Authentication</h4><p>Scanning QR codes in a remote headless terminal can be clunky. Thankfully, the WhatsApp bridge code supports generating a simple 8-character pairing code directly.</p><p>Since the agent has configured WHATSAPP_PHONE_NUMBER with your number, you can now launch the bridge manually once to request the pairing code:</p><pre>cd ~/.gemini/config/sidecars/whatsapp-bridge<br>node bridge.js</pre><p>Instead of showing a QR code, the terminal logs will display your association code:</p><pre>=========================================<br>VOTRE CODE D&#39;ASSOCIATION WHATSAPP : XXXX-XXXX<br>=========================================</pre><p>On your phone:</p><ol><li>Open <strong>WhatsApp</strong> → <strong>Settings</strong> → <strong>Linked Devices</strong> → <strong>Link with phone number instead</strong> (or <strong>Link a Device</strong> and select phone number pairing).</li><li>Enter the 8-character code displayed in your terminal.</li></ol><p>Once WhatsApp shows the connection is established, press Ctrl+C to stop the manual process. The authentication state is saved in auth_session/, and the sidecar will run automatically in the background going forward.</p><p>Now restart Antigravity. The WhatsApp bridge sidecar will launch automatically as a background service.</p><h4>Step 4: Start chatting with your agent</h4><p>Open WhatsApp on your phone and navigate to your <strong>self-chat</strong> (the chat with your own number). Send a message:</p><pre>Hello! What can you do?</pre><p>Within seconds, your Antigravity agent will respond, right there in WhatsApp.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HrSqpXigo_MAU4Z_85bapQ.png" /><figcaption>Conversation example with Antigravity from WhatsApp</figcaption></figure><p>The agent has the <strong>full power of Antigravity</strong>, including file system access, terminal execution, web search, code generation, and multi-step reasoning, all accessible from your phone.</p><h3>Smart conversation management</h3><p>OpenGravity handles conversation context automatically:</p><ul><li><strong>Within 1 hour</strong>: Your messages continue the same conversation thread. The agent remembers everything.</li><li><strong>After 1 hour of inactivity</strong>: A fresh conversation is automatically started, accompanied by a system note so the agent knows the context has changed.</li><li><strong>Project switching</strong>: If you change the projectId in the sidecar configuration, the next message automatically starts a conversation under the new project.</li><li><strong>Manual control</strong>: Use /new to force a fresh start, or /reply &lt;id&gt; to jump back into any previous conversation.</li></ul><h4>Human-in-the-Loop Approvals</h4><p>When the agent needs to execute a command, it sends you an approval request:</p><pre>⚠️ [OpenGravity Authorization Request]<br>Tool: run_command<br>Command: npm run build<br>Reply with:<br>• 👍 to allow<br>• 👎 to deny</pre><p>Just tap the emoji. The agent waits for your decision before proceeding. This keeps you in full control even when you’re not watching the terminal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zR3o2USs21HhEgJphm4W0g.png" /><figcaption>WhatsApp conversation with image received from Antigravity</figcaption></figure><h3>What’s next: Extending the agent’s capabilities</h3><p>OpenGravity as it stands today is a functional, powerful bridge. But it’s just the beginning. Here’s what’s on the roadmap:</p><h4>🔗 Google Workspace CLI integration</h4><p>Connect the agent to your Google Workspace, including Gmail, Calendar, Drive, and Docs. Imagine telling your agent: <em>“Schedule a meeting with the team for Thursday and draft the agenda in a Google Doc.”</em> The plumbing exists; it just needs to be wired up.</p><h4>⏱️ Background tasks &amp; autonomous operations</h4><p>Give the agent the ability to run <strong>scheduled tasks</strong> and <strong>long-running background jobs</strong>. Monitor a service, run nightly builds, generate daily reports, all without you sending a single message. The agent proactively does the work and notifies you when it’s done.</p><h4>🧩 Extended skills &amp; plugins</h4><p>OpenGravity’s plugin system means you can <strong>teach your agent new capabilities</strong>. Custom skills for your specific workflow, such as deploying to staging, running test suites, parsing logs, and managing infrastructure. The skill files are simple markdown instructions that the agent follows.</p><h3>The bigger picture: Agents as team members</h3><p>I want to step back from the technical details for a moment and share what I truly believe is happening, and where projects like OpenGravity fit in the bigger picture.</p><h4>Agents are the next fundamental shift</h4><p>We’ve seen waves of transformation in tech: cloud computing, mobile, DevOps, and AI-assisted coding. <strong>Autonomous agents are the next one.</strong> Not chatbots, and not co-pilots that wait for you to press Tab. We are talking about real agents that can reason, plan, execute, and report back.</p><h4>What I’m building toward</h4><p>OpenGravity is a piece of a much larger puzzle. The vision is this:</p><p><strong>An AI agent should be a real member of your team.</strong></p><p>Think about what that means:</p><ul><li><strong>It needs to communicate.</strong> That’s what the WhatsApp integration solves; a natural, always-available communication channel. In the future, it could also be Slack, email, or any other channel your team uses.</li><li><strong>It needs a “desk.”</strong> A cloud VM gives the agent its own workspace, consisting of its own file system, its own terminal, and its own environment, allowing it to work independently without stepping on anyone’s toes.</li><li><strong>It needs an identity.</strong> This is the next frontier. Imagine the agent having its own <strong>Google Workspace account</strong>; a real email address, a calendar, and access to shared drives. It can receive tasks via email, update shared documents, and participate in the team’s workflow.</li><li><strong>It needs a role.</strong> Just like any team member, the agent needs defined responsibilities, permissions, and skills. Antigravity’s skill system is the foundation for this; you define what the agent can do, how it should behave, and what guardrails to enforce.</li></ul><h3>The future of work with agents</h3><p>I believe that within the next few years, we’ll see organizations where <strong>agents are integrated into teams alongside humans</strong>. We are not replacing people, but augmenting them. We will have an agent that handles the tedious operational tasks, monitors systems overnight, prepares research before a meeting, or drafts documentation after a sprint review.</p><p>For that to work, we need several things:</p><ul><li><strong>Communication channels</strong>: ✅ OpenGravity (WhatsApp today, more channels tomorrow)</li><li><strong>An isolated workspace</strong>: ✅ Cloud VM with full system access</li><li><strong>Tools and capabilities</strong>: ✅ Antigravity’s rich skill system</li><li><strong>A persona and identity</strong>: 🔜 Google Workspace integration, team roles</li><li><strong>Trust and safety</strong>: ✅ Human-in-the-loop approvals, sandboxed execution</li></ul><p>This is a long-running effort. Building the right tools, defining the right skills, crafting the right persona; it all takes time. But I’m convinced this is the direction we’re heading, and OpenGravity is my first concrete step toward making it real.</p><h3>Conclusion</h3><p>OpenGravity gives me an <strong>always-on, always-available AI assistant</strong> that lives on a cloud VM and responds to my WhatsApp messages. It uses my existing Antigravity subscription, runs safely in an isolated environment, and keeps me in control through approval workflows.</p><p>If you’re an Antigravity user who wants to take your agent beyond the IDE and into the real world, give OpenGravity a try.</p><p>🔗 <strong>Repository</strong>: <a href="https://github.com/St3ph-fr/OpenGravity">github.com/St3ph-fr/OpenGravity</a></p><p>The setup takes about 20 minutes; the possibilities are endless.</p><p><em>If you found this article useful, feel free to give it a clap 👏 and share it with others who might be interested in autonomous agent architectures. And if you build something cool with OpenGravity, I’d love to hear about it!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=df6cc8b84404" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/opengravity-turn-antigravity-into-your-autonomous-cloud-agent-controlled-from-whatsapp-df6cc8b84404">OpenGravity: Turn Antigravity into your autonomous cloud agent, controlled from WhatsApp</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Serverless, Multi-Source Data Ingestion Framework on GCP (Snowflake & Databricks to…]]></title>
            <link>https://medium.com/google-cloud/building-a-serverless-multi-source-data-ingestion-framework-on-gcp-snowflake-databricks-to-6c4fd5ace10f?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/6c4fd5ace10f</guid>
            <category><![CDATA[dataproc]]></category>
            <category><![CDATA[apache-iceberg]]></category>
            <category><![CDATA[bigquery]]></category>
            <category><![CDATA[snowflake]]></category>
            <category><![CDATA[dbt]]></category>
            <dc:creator><![CDATA[Prabha Arya]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 04:59:10 GMT</pubDate>
            <atom:updated>2026-06-20T04:59:09.083Z</atom:updated>
            <content:encoded><![CDATA[<h3>Building a Serverless, Multi-Source Data Ingestion Framework on GCP (Snowflake &amp; Databricks to BigQuery)</h3><h3>Introduction</h3><p>In the modern data era, organizations often find themselves managing data across multiple cloud platforms and data warehouses. A common challenge is consolidating this data into a single, centralized analytics hub like <strong>Google BigQuery</strong>.</p><p>Traditional ETL pipelines often require complex infrastructure management, leading to high operational overhead and spiraling costs. Managing persistent Spark clusters just to run periodic data copies is a prime example of resource waste.</p><p>To solve this, we built a <strong>Serverless, Multi-Source Data Ingestion Framework</strong> on Google Cloud Platform (GCP). This framework dynamically orchestrates parallel data copies from both <strong>Snowflake</strong> and <strong>Databricks (Unity Catalog)</strong> into <strong>BigQuery</strong> using <strong>GCP Workflows</strong> and <strong>Dataproc Serverless</strong>.</p><p>Here is how we designed it, the challenges we solved, and why this architecture is a game-changer for data engineering teams.</p><h3>The Architecture: Orchestration Meets Serverless Compute</h3><p>Our goal was simple: <strong>Zero cluster management, zero idle compute costs, and maximum parallelism.</strong></p><p>To achieve this, we decoupled orchestration from compute:</p><ol><li><strong>Orchestrator (GCP Workflows)</strong>: A serverless, lightweight orchestrator that parses a JSON configuration manifest, manages authentication secrets, and dynamically triggers parallel execution steps.</li><li><strong>Compute (Dataproc Serverless)</strong>: Instead of maintaining a running Spark cluster, we spin up ephemeral Spark jobs via Dataproc Serverless. We only pay for the exact seconds the data copy runs.</li></ol><p>Here is the high-level architecture:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hv-gC-K4DsKB3KVj8kXBiQ.png" /></figure><h3>Why GCP Workflows?</h3><p>Unlike Airflow (Cloud Composer), which requires a continuously running environment, GCP Workflows is completely serverless. It charges per step execution, making it incredibly cost-effective for orchestrating batch loads that run daily or hourly. It natively handles parallel loops, allowing us to ingest dozens of tables concurrently.</p><h3>Key Engineering Challenges &amp; Solutions</h3><p>Building a generic framework that handles multiple sources is never just about “connecting A to B.” Here are the production-grade stabilization measures we built into the PySpark jobs:</p><h3>1. Smart Incremental Loading (Deltas)</h3><p>To minimize data transfer, the framework automatically detects if it should perform a full historical load or an incremental delta load.</p><ul><li>It queries the target BigQuery table to find the maximum timestamp in the partition field.</li><li>If the table exists and contains data, it extracts only newer rows from the source (Snowflake/Databricks).</li><li>If the table is empty or doesn’t exist, it defaults to a full load.</li></ul><h3>2. “Diversity Guards” Against Duplication</h3><p>When dealing with incremental loads, source systems sometimes refresh a table completely (a snapshot) instead of appending. If you blindly run a delta load on a refreshed source, you risk duplicating rows.</p><ul><li><strong>Our Solution</strong>: The framework evaluates distinct timestamps in the source dataset. If it detects a single unified timestamp across the new data, it identifies this as a full snapshot refresh and automatically overrides the write mode to overwrite, preventing duplication.</li></ul><h3>3. Handling Complex Data Types (Snowflake Variants)</h3><p>Snowflake makes heavy use of the VARIANT type to store semi-structured JSON. When Spark reads this via JDBC, it often struggles to map it directly to Parquet, leading to writer class-cast exceptions.</p><ul><li><strong>Our Solution</strong>: We implemented programmatic schema inspection in PySpark. The job identifies MapType, ArrayType, or known Variant columns and automatically serializes them into clean JSON strings before writing to the staging area, ensuring smooth BigQuery loading.</li></ul><h3>4. Nullability &amp; JVM Protection</h3><p>Spark and BigQuery sometimes disagree on schema nullability. A source schema might mark a field as “non-nullable,” but the incoming data contains unexpected nulls. In Spark, this can trigger JVM NullPointer exceptions during view transformations.</p><ul><li><strong>Our Solution</strong>: We built a “Catalyst-Suppressed Nullability” utility that programmatically overrides nullability flags on strictly non-nullable source fields when preparing the Spark DataFrame schema, making the pipeline resilient to bad source data.</li></ul><h3>5. Column Sanitization</h3><p>BigQuery has strict rules about column names (e.g., no spaces, special characters, or system prefixes like _PARTITION).</p><ul><li><strong>Our Solution</strong>: The framework automatically sanitizes all column names, replacing invalid characters and renaming restricted prefixes to conform to BigQuery standards.</li></ul><h3>Declarative Configuration</h3><p>Data engineers don’t need to write code to add new tables. They simply update a JSON manifest:</p><pre>{<br>  &quot;project&quot;: &quot;my-gcp-project&quot;,<br>  &quot;snowflake_tables&quot;: [<br>    {<br>      &quot;source_schema&quot;: &quot;SALES_DB&quot;,<br>      &quot;source_table&quot;: &quot;TRANSACTIONS&quot;,<br>      &quot;target_bq&quot;: &quot;my-gcp-project.sales.transactions&quot;,<br>      &quot;bq_partition_field&quot;: &quot;_extracted_at&quot;,<br>      &quot;write_mode&quot;: &quot;auto&quot;<br>    }<br>  ]<br>}</pre><p>By setting write_mode to auto, the framework automatically handles the logic of historical vs. incremental loads.</p><h3>Business &amp; Operational Benefits</h3><ul><li><strong>Cost Reductions</strong>: Moving from persistent Dataproc clusters to Dataproc Serverless reduced our compute costs by up to 60% for batch workloads.</li><li><strong>Operational Simplicity</strong>: No Kubernetes or Spark clusters to configure, patch, or scale. GCP handles the infrastructure.</li><li><strong>Speed to Production</strong>: Adding a new table to the ingestion pipeline is now a configuration change, not a coding task.</li></ul><h3>Conclusion</h3><p>By combining the serverless orchestration of GCP Workflows with the elastic scale of Dataproc Serverless, we built a highly resilient, cost-effective ingestion framework. It abstracts away the complexities of cross-cloud data movement, allowing data teams to focus on delivering insights rather than managing infrastructure. Please refer full solution <a href="https://github.com/prabhaarya/gcp-spark-data-copy-framework">here</a>.</p><p><em>What are your biggest pain points when migrating data from Snowflake or Databricks to BigQuery? Let’s discuss in the comments!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6c4fd5ace10f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-a-serverless-multi-source-data-ingestion-framework-on-gcp-snowflake-databricks-to-6c4fd5ace10f">Building a Serverless, Multi-Source Data Ingestion Framework on GCP (Snowflake &amp; Databricks to…</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[You got informed consent. Can you prove the AI was right?]]></title>
            <link>https://medium.com/google-cloud/you-got-informed-consent-can-you-prove-the-ai-was-right-f62bda72d602?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/f62bda72d602</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[sre]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[database]]></category>
            <dc:creator><![CDATA[Boris Dali]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 02:16:53 GMT</pubDate>
            <atom:updated>2026-06-19T14:56:29.350Z</atom:updated>
            <content:encoded><![CDATA[<h4>A sequel to “You let AI operate on a production database without your consent?”</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GxULw7_ZIeDMhv-Eid-Cpw.png" /></figure><p>The <a href="https://medium.com/google-cloud/you-let-ai-operate-on-production-database-without-your-consent-bd4ffb954266">first post</a> ended with a gate.</p><p>A gate is what we call an optional, but highly recommended pause between AI <em>diagnosis</em> and AI <em>action</em>. It’s a triage screen that shows the operator exactly what the agents found, what they propose to do about it, the blast radius of doing it and the right to say no. Enter the <a href="https://github.com/borisdali/helpdesk/blob/main/docs/INFORMED_CONSENT.md">Informed Consent </a>framework borrowed from medical ethics: you cannot operate without telling the patient the diagnosis, proposing the treatment and getting explicit agreement.</p><p>That post made the case for why the gate has to exist. This one asks the harder question that comes after: you said “yes” at the gate, but was the diagnosis you consented to, actually correct? And how does your AI system go about providing a dead-easy proof that it delivered exactly as promised?</p><p>Because consent is where the conversation begins, not where it ends.</p><h3>The gap nobody talks about</h3><p>All respectable AI SRE tools claim transparency. They show you a diagnosis before they act. They present a remediation plan upfront. Some even let you approve individual, especially destructive, steps. That’s table stakes.</p><p>In my observation, what is largely missing in most AI SRE tools are the answers to the following two questions:</p><p>For your particular failure scenario…</p><ul><li>How often the <em>diagnosis</em> was <strong>actually</strong> right.</li><li>Whether the <em>remediation</em> was <strong>actually</strong> appropriate.</li></ul><p>These questions should be asked at the decision time. And the historical answers to these two questions should be presented to an operator, so that they can make a more informed decision. Because these answers reveal how a similar failure scenario was handled in the past. Right there on the same triage screen that the current on-caller needs to make a decision. NOW!</p><p>This matters more than it sounds. An operator at 2am staring at a screen that says “Root blocker PID 867 holds a transaction lock; terminate it” is not running their own analysis. They are evaluating an AI claim under time pressure. If that claim is correct 91% of the time, they have more confidence that the track history of AI diagnosis of this particular problem is good and so they could consider approving it. If it’s correct 60% of the time, they should probably investigate before acting. And if the AI reports 95% confidence in both cases — which number do they use?</p><p>Here’s the thing: <strong>without measurement, the gate is a ritual.</strong> The operator clicked approve because the screen looked authoritative, the clock was ticking, VP was looking over their shoulder and there was no better option. That is not informed consent. That is <em>informed-looking</em> consent.</p><p>To turn the gate from a ritual into a measured property, aiHelpDesk features a feedback loop designed to facilitate the <a href="https://github.com/borisdali/helpdesk/blob/main/docs/INFORMED_CONSENT.md">Informed Consent</a>, which is an integral part of the <strong>Operational SRE/DBA Flywheel</strong> (see <a href="https://github.com/borisdali/helpdesk/blob/main/docs/VAULT.md#the-operational-sredba-flywheel">here</a> and <a href="https://medium.com/google-cloud/your-sre-on-call-runbook-is-already-obsolete-heres-why-that-s-not-your-fault-0a82b3b0183c#7fe7">here</a>):</p><h3>aiHelpDesk Feedback Loop</h3><p>Every gate interaction generates a feedback record. Two questions, captured in sequence:</p><p>At the gate, before remediation runs:<br> — Is the diagnosis correct?<br> — Is the proposed remediation approach appropriate?</p><p>After recovery completes (aka post-incident):<br> — Looking back: was the diagnosis correct?<br>— Looking back: was the remediation appropriate?</p><p>These are not survey fields bolted on after the fact. They are the first-class records in the audit store, keyed to the same run ID as the playbook execution, the step log and the automated evaluation score. The gate is where the human verdict enters the system. Everything else is downstream from here.</p><p>Who is the primary consumer of this data? Meet the <em>vault</em> commands:</p><p>vault <em>drift</em> → Which faults are regressing over time?<br> vault <em>versions</em> → Did the last playbook update help or hurt?<br> vault <em>accuracy</em> → How often does the agent actually diagnose correctly?<br> vault <em>calibration</em> → Can I trust the automated scores?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eoXPbqsbYBE0gU3KAxKiTw.png" /></figure><p>These commands form a dependency chain. <em>Drift</em> tells you which fault to look at. <em>Versions</em> correlates the regression to a playbook change. <em>Accuracy</em> checks whether diagnosis quality actually improves (or drops). <em>Calibration</em> validates whether the scores you’ve been reading are reliable in the first place.</p><p>We recommend working through them in order. <em>Drift</em> is where you start because it surfaces the signal. <em>Calibration</em> is where you end because it validates that signal. The loop closes.</p><h3>Why the gate is the best place to ask</h3><p>In our experience, the gate is the best place to ask an operator for a feedback on the AI diagnosis. Because at this time an operator has to make a decision. Not just assessing if the diagnosis is <em>correct</em>, but also, was the diagnosis clearly <em>explained</em>, was it well presented, was it easy to grasp to form… well, an informed opinion?</p><p>We find that it’s critical to pose this feedback question <em>before</em> the operator knows whether remediation will succeed. We repeat the same question again post-incident, but that’s already a look in a rear view mirror. Also important, but giving a different signal.</p><p>This feedback ordering is deliberate. In our experience, the post-incident feedback is contaminated by outcome bias. An operator who just saw a clean recovery is more likely to confirm the diagnosis regardless of whether they actually understood and evaluated it. The relief of a resolved incident retroactively validates the path that got there.</p><p>What’s not what we are after. To improve and evolve triage playbooks, we need honesty. At-gate feedback has no outcome bias contamination. The operator is reading a hypothesis, possibly at 2am in the morning, possibly on their small cell phone screen. Yes, they are also presented with a proposed action plan to fix the problem, but they have no knowledge yet of the remediation outcome. <em>This</em> verdict is the honest one.</p><p>This is why <em>vault calibration</em> prefers at-gate feedback over post-incident when both exist for the same run. It is also why, if you are starting a feedback program, and we recommend that you do, the at-gate question matters more than the post-incident one. You get fewer clean shots at unbiased measurement than you think.</p><p>That’s our experience anyway. All feedback is optional, which means that an operator is free to skip any and all of our four questions. We advise against it. We encourage the SRE teams include it in their SoP the diligence of providing the feedback. But ultimately, whether you answer all four questions is up to you. <a href="https://github.com/borisdali/helpdesk/blob/main/docs/VAULT_FEEDBACK_FLOW.md">This is</a> the description of the feedback loop flow and our recommendations.</p><blockquote>If you want to reproduce the findings presented in this blog post, please feel free to check out <a href="https://github.com/borisdali/helpdesk/blob/main/docs/BENCHMARKING_SAMPLE7.md">this doc page</a> for details on the commands to run (for running aiHelpDesk Fault Injection Tests directly on a host/VM in particular or see the other samples for <a href="https://github.com/borisdali/helpdesk/blob/main/docs/BENCHMARKING_SAMPLE5.md">K8s</a> and <a href="https://github.com/borisdali/helpdesk/blob/main/docs/BENCHMARKING_SAMPLE6.md">Docker/Podman</a>), but the excerpts below should be sufficient to make our point:</blockquote><h3>Calibration is the clincher</h3><p>After enough feedback accumulates, <em>vault calibration</em> produces something that very few SRE tools do:</p><pre>Diagnosis calibration — fleet-wide <br>(13 runs with eval + operator feedback)<br><br>  CONF BAND  RUNS  CORRECT  ACCURACY       CALIBRATION<br>  ───────── ───── ──────── ───────── ─────────────────<br>    90-100%    12      11        91%    WELL_CALIBRATED<br>     70-89%     1       1       100%  INSUFFICIENT_DATA<br>       &lt;70%     0       0          –  INSUFFICIENT_DATA</pre><p>Read this table carefully. When the agent reported 90–100% confidence in its diagnosis, it was confirmed correct by operators 91% of the time. The expected accuracy for that band, which is roughly mid-point 95%, is within 10 percentage points of the actual 91%. That is what WELL_CALIBRATED means: the model’s internal confidence score is an honest signal, not a number printed to look authoritative.</p><p>Compare this to OVERCONFIDENT, which fires when the actual accuracy falls more than 10 points below the expected band mid-point. If your 90–100% confidence band is only correct 70% of the time, the agent is systematically overstating its certainty. We’ve seen way too many times. And you certainly would want to know that. You would want to lower the autonomous action threshold for that failure scenario until the calibration improves.</p><p>This is what <strong>verifiable informed consent</strong> looks like. Not “the AI told the operator before acting.” But: the operator’s verdict, collected systematically, run against the AI’s stated confidence, checked for consistency. When it checks out, you have evidence. When it doesn’t, you have an early warning.</p><p>That was triage. The remediation side produces the same calibration, but independently of triage, because a correct diagnosis can still result in a wrong remediation:</p><pre>  Remediation calibration — fleet-wide <br>  (5 runs with remediation score + operator feedback)<br><br>  SCORE BAND  RUNS  CORRECT  ACCURACY     CALIBRATION<br>  ────────── ───── ──────── ───────── ────────────────<br>     90-100%     5        5      100%  WELL_CALIBRATED</pre><p>Five runs is not enough to draw any strong conclusions. But the structure is there and the data accumulates automatically with every <em>faulttest</em> run.</p><h3>The autonomy gradient</h3><p>The <a href="https://medium.com/google-cloud/you-let-ai-operate-on-production-database-without-your-consent-bd4ffb954266">first post</a> framed full autonomy as something to be suspicious of. That framing holds, but it needs a second half.</p><p>Because the full autonomy in <em>auto mode</em> is available in aiHelpDesk too. It is not forbidden and it is not irresponsible … if used in the right circumstances. And those circumstances are very specific: you have run enough fault injection tests to accumulate the calibration data, so that <em>vault calibration</em> shows WELL_CALIBRATED across the confidence bands that matter for your environment and the approval mode you relax to still respects your playbook’s permitted_tools whitelist.</p><p>The journey is this:</p><ol><li>Run in manual mode. Collect at-gate feedback on every gate interaction.</li><li>Watch <em>vault accuracy</em> accumulate. Look for correctness above your bar, whatever that means for your risk tolerance.</li><li>Run <em>vault calibration</em>. Confirm the automated scores predict real accuracy.</li><li>When both hold, relax the approval mode.</li></ol><p>Skipping to step 4 is not faster. It is unverified. The difference between an operator who approved 50 gates with feedback and an operator who skipped the gate entirely is not attitude toward AI. It is evidence. The first operator knows whether and when the AI is right. The second is guessing.</p><p>This is also why the gate timeout matters. A gate not resolved within the configured window, transitions to abandoned. Not silently approved. There’s a sharp difference. The system defaults to inaction, not action. Speed is not the goal. Verifiable correctness is.</p><h3>What we shipped</h3><p>The feedback loop described her is part of the higher level <strong>Operational SRE/DBA Flywheel</strong> and it’s live in the current release. Specifically:</p><ul><li><em>At-gate</em> and <em>post-incident</em> feedback for both <em>diagnosis</em> and <em>remediation</em>. All four combinations, captured interactively during <em>faulttest</em> runs or via API for CI/CD pipelines.</li><li><em>vault accuracy</em> showing per-series correctness with a triage and remediation breakdown</li><li><em>vault calibration</em> comparing automated confidence scores to operator-confirmed outcomes, fleet-wide or per fault</li><li><em>vault drift</em> detecting pass-rate regressions before they become production incidents, optionally with a “gateway path” for multi-machine fleet data</li><li><em>vault versions</em> correlating per-playbook-version metrics like step count, recovery time, diagnosis score, remediation score, etc. This is so a bad update is visible before it accumulates too much history</li></ul><p>The failure injection test harness that produces all of this data runs against a real Postgres database (either a local, dynamically span Docker if “-auto-db” option is requested or against any BYO instance), injects real failure conditions and captures operator feedback interactively at the exact gate where it matters most.</p><h3>In a nutshell</h3><p>The <a href="https://medium.com/google-cloud/you-let-ai-operate-on-production-database-without-your-consent-bd4ffb954266">first post</a> asked: did the AI operate with your consent?</p><p>This post asks a follow up question: when you consented, were you right to?</p><p>Those are different questions. The second one is harder to answer. It requires measurement infrastructure, in particular, feedback capture, evaluation storage, calibration logic, etc. It also requires a philosophical commitment that is easy to skip: the belief that your approval at the gate is a data point that should be tracked, aggregated and used to evaluate the system that asked for your approval.</p><p>aiHelpDesk tracks and measures it. The flywheel is the proof.</p><p>Does your AI system do this?</p><p>aiHelpDesk is open source. The <em>fault injection test </em>harness, the feedback schema and the <em>vault</em> command suite are in the repository. If you run it and your calibration comes back OVERCONFIDENT, that is useful information. Don’t discard it. Work with us to make it WELL_CALIBRATED.</p><h3>Why aiHelpDesk Playbooks are trustworthy?</h3><p>Because we give you, the customer, an ability to vet, verify and improve them through the methodology that we refer to as <strong>Operational SRE/DBA Flywheel</strong>, see <a href="https://github.com/borisdali/helpdesk/blob/main/docs/VAULT.md#the-operational-sredba-flywheel">here</a> and <a href="https://medium.com/google-cloud/your-sre-on-call-runbook-is-already-obsolete-heres-why-that-s-not-your-fault-0a82b3b0183c#7fe7">here</a> for details.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jDd-s1Dqg68wPe3E.png" /></figure><p>And yes, as a customer, you can not only confirm that the playbooks that you get with aiHelpDesk out of the box work for your environment, but you can easily bring your own. Both: BYO playbooks (by either importing your existing runbooks or cloning and customizing one of our’s or by creating one from scratch) + BYO faults as well.</p><blockquote>Because nobody knows your specific databases, your environment and your workload with your upstream/downstream apps better than you do. You know how your database fails. Vendors don’t. At aiHelpDesk, we give you an option to create your own faults and add your own playbooks to triage and rectify them (in addition to the system playbooks we ship, of course).</blockquote><p>And yes, we don’t depend on a particular model or a model provider. aiHelpDesk is model agnostic. From our standpoint, the LLMs are a disposable commodity. Flip from Gemini to Anthropic and aiHelpDesk should continue to give you exactly the same diagnosis and remediation. Anything shorter than that is a P0 bug.</p><h3>Related Reading</h3><ul><li>aiHelpDesk Flywheel <a href="https://github.com/borisdali/helpdesk/blob/main/docs/VAULT.md#the-operational-sredba-flywheel">official documentation</a></li><li><a href="https://medium.com/google-cloud/your-sre-on-call-runbook-is-already-obsolete-heres-why-that-s-not-your-fault-0a82b3b0183c">Your SRE On-Call Runbook Is Already Obsolete. Here’s Why That’s Not Your Fault</a>: Introducing aiHelpDesk Operational SRE/DBA Flywheel</li><li><a href="https://medium.com/@borisdali/does-your-ai-sre-dba-actually-work-aihelpdesk-can-prove-it-with-the-fault-injection-testing-68ddb6f2428a">The Missing Test Suite for AI Database Operations</a>: You’re about to bet your SRE/DBA on-call rotation on an AI agent. Want to know if it’s any good before the 2am page goes off?</li><li><a href="https://medium.com/@borisdali/runbooks-rot-playbooks-learn-bec433817938">Runbooks Rot. Playbooks Learn</a>: Operational SRE/DBA Flywheel: Ops Knowledge That Compounds. Automatically. Improving with every incident</li><li><a href="https://medium.com/google-cloud/we-wanted-a-dramatic-ai-agent-failure-we-got-something-better-5d6d57135a88">We Wanted a Dramatic AI Agent Failure. We Got Something Better</a>:<br>When the Flywheel works: The K8s WAL fault that made us rethink what playbooks are for</li><li><a href="https://medium.com/@borisdali/ai-database-troubleshooting-the-postgresql-stat-that-looks-like-good-news-and-aint-16f1b52143ec">AI Database Troubleshooting: the PostgreSQL Stat That Looks Like Good News (But Ain’t)</a>: What a bgwriter incident taught us about the difference between reading data and understanding it</li><li><a href="https://medium.com/@borisdali/ai-troubleshooted-db-pile-up-and-reported-success-the-locks-didnt-care-d8c06faded82">AI troubleshooted DB pileup and reported success. The locks didn’t care</a>: It’s the story that shows that the model wasn’t bad at reasoning. But it reasoned without the right knowledge.</li><li><a href="https://medium.com/google-cloud/your-ai-just-diagnosed-the-outage-should-it-fix-it-too-ff6a43ec475f">Your AI Just Diagnosed the Outage. Should It Fix It Too?</a> How Decision Hub puts a human at every boundary between knowing and doing. And how we tried to override our own governance model and it said no. Twice.</li></ul><p>As of this writing, aiHelpDesk is available in Beta. If you’re running PostgreSQL in production and would like to get help in preparing for <a href="https://medium.com/google-cloud/your-sre-on-call-runbook-is-already-obsolete-heres-why-that-s-not-your-fault-0a82b3b0183c#5634">the avalanche</a>, consider aiHelpDesk. Reach out to us at <a href="mailto: info@aiHelpDesk.biz">info@aiHelpDesk.biz</a> and we’ll be happy to show you what it looks like in practice.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f62bda72d602" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/you-got-informed-consent-can-you-prove-the-ai-was-right-f62bda72d602">You got informed consent. Can you prove the AI was right?</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Agent vs. AI Harness: Where Memory Actually Lives]]></title>
            <link>https://medium.com/google-cloud/ai-agent-vs-ai-harness-where-memory-actually-lives-7067e64d20a3?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/7067e64d20a3</guid>
            <category><![CDATA[agentic-workflow]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <dc:creator><![CDATA[Qingyue(Annie) Wang]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 02:16:30 GMT</pubDate>
            <atom:updated>2026-06-19T02:16:29.512Z</atom:updated>
            <content:encoded><![CDATA[<h3>The model decides what to do. The harness stores memory, runs tools, enforces rules, and keeps the agent working.</h3><p><a href="https://medium.com/google-cloud/how-to-build-an-ai-agent-that-learns-76faea6d0208"><em>Part 2 named the building blocks: sessions, Memory Bank, runtime, identity. </em></a><em>This part draws the boundary around them: which pieces belong to the agent’s behavior, and which pieces belong to the harness that operates it.</em></p><p>When an AI agent reads a file, who actually reads it?</p><p>Not the model.</p><p>The model decides that reading the file would help. The harness checks the path, runs the tool, limits the output, records the event, and sends the result back.</p><p>That is the agent/harness split in one example:</p><p>the <strong>agent</strong> is the behavior you experience;<br>the <strong>harness</strong> is the machinery that makes the behavior possible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4CVM5LKXqGUryy13m0XJRg.png" /></figure><p>In this post, I’ll use that split to answer one practical question: which parts of an AI agent should be agent-specific, and which parts should become reusable harness infrastructure?</p><p>The distinction sounds like vocabulary until you try to add persistent memory, enforce permissions, recover from failure, or operate a second agent. Then it becomes an architectural boundary.</p><h3>The word “agent” hides three layers</h3><p>In ordinary conversation, we call the entire running product an agent. That is useful shorthand.</p><p>When designing the system, it helps to separate three layers:</p><ul><li><strong>Model:</strong> generates responses and decisions from the context it receives.</li><li><strong>Agent behavior:</strong> the goal, instructions, tools, and policies configured for a particular job.</li><li><strong>Harness:</strong> the reusable machinery that runs the behavior and connects it to the outside world.</li></ul><p>For Dana’s support agent, the layers might look like this:</p><pre>MODEL<br>an LLM that can reason and request tools</pre><pre>AGENT BEHAVIOR<br>&quot;resolve customer-support tickets&quot;<br>+ support instructions<br>+ account and ticket tools</pre><pre>HARNESS<br>execution loop<br>+ context assembly<br>+ tool dispatch and approvals<br>+ sessions and memory<br>+ identity and authorization<br>+ retries, traces, and evaluation</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Et1vr_o_Uw8c-tn1a6w7FA.png" /></figure><p>This split is not about arguing over terminology. Frameworks use “agent” differently, and capabilities can cross layers.</p><p>The point is to make ownership visible: what can you swap, reuse, govern, and debug?</p><h3>A Simple Test for Finding the Harness</h3><p>A simple way to find the harness is to ask what would stay if the agent changed.</p><p>I think of this as the <strong>swap test</strong>:</p><blockquote><em>If you replace the model or configure a different task, which machinery can remain?</em></blockquote><p>Suppose Dana’s support agent moves to another model. Its behavior may change, but much of the surrounding system can remain:</p><ul><li>ticket and account integrations;</li><li>permission checks;</li><li>session storage;</li><li>memory retrieval;</li><li>trajectory logging;</li><li>retries, traces, and evaluation.</li></ul><p>Now keep the model but replace the support behavior with a billing-review agent. Domain tools and instructions change, but the execution loop, identity controls, logging format, and storage infrastructure may still be reusable.</p><p>The parts that survive are good candidates for the harness.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7p9piko3H3G3oG5fkAnZAw.png" /></figure><p>The swap test is not a perfect rule. Model changes can require prompt changes. New tasks can require different safety policies. Some memories should remain private to one user or agent. The point is simpler: the test reveals which concerns <em>could</em> become shared infrastructure instead of being rebuilt every time.</p><h3>Why memory belongs in the harness</h3><p><a href="https://medium.com/google-cloud/what-is-reflective-memory-and-why-does-your-ai-agent-need-it-5aa1579fb57d">In Part 1, reflective memory was the lesson an agent carries forward from experience.</a> Dana’s support agent should remember her account context next week. It should also learn from a failed access ticket after the ticket is closed.</p><p>Neither of those happens inside a single model call.</p><p>This is why memory cannot just be a field on the agent object.</p><p>The model can help decide what was learned. But something outside the call must:</p><ol><li>capture the conversation or completed task trajectory;</li><li>store it under the correct user, tenant, and agent scope;</li><li>validate, consolidate, update, or expire memories;</li><li>retrieve relevant memories for a future interaction;</li><li>support permissions, audit, and deletion.</li></ol><p>That lifecycle belongs naturally in harness infrastructure.</p><p>But there is an important distinction:</p><blockquote><strong><em>The harness operates the memory lifecycle. Scope decides who owns and may read each memory.</em></strong></blockquote><p>Dana’s preferences may belong to Dana. A support procedure may belong to the support domain. A temporary plan may belong only to one session. A broadly useful lesson may be eligible for carefully governed sharing.</p><p>Calling memory a harness responsibility should never mean “put every memory in one shared bucket.”</p><h3>What Is the Agent, and What Runs It?</h3><p>So far, the agent/harness split has been conceptual. Google’s <a href="https://adk.dev/">Agent Development Kit (ADK)</a> makes the boundary visible in code.</p><p><a href="https://adk.dev/">ADK</a> gives you an Agent object for the configured behavior: model, instructions, tools, and callbacks.</p><p>It also gives you a Runner plus services for the machinery that operates that behavior: execution, sessions, memory, and artifacts.</p><pre>support_agent = Agent(<br>    name=&quot;support_agent&quot;,<br>    model=MODEL,<br>    instruction=SUPPORT_INSTRUCTIONS,<br>    tools=[search_account, recall],<br>)</pre><pre>runner = Runner(<br>    agent=support_agent,<br>    app_name=&quot;support&quot;,<br>    session_service=session_service,<br>    memory_service=memory_service,<br>)</pre><p>The first object describes the support job. The runner and services operate it.</p><p>ADK gives you the pieces to assemble a harness. But assembling the harness is not the same as operating it.</p><p>You still have to run it, persist state, enforce identity, govern tool calls, observe failures, and improve the agent over time.</p><p>That is where Agent Platform enters the picture.</p><h3>When Google Operates More of the Harness</h3><p><a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/overview">Gemini Enterprise Agent Platform</a> moves more of that operating layer into managed Google Cloud services: runtime, sessions, memory, identity, gateway policy, evaluation, and observability.</p><p>The agent behavior can stay small: its instructions, tools, and task logic. The surrounding machinery becomes managed platform capability instead of custom infrastructure every team rebuilds.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BeQ4aFKOn_JCNkl3jL4T4Q.png" /></figure><p>Most of those are operating concerns rather than one agent’s business behavior. That makes the platform useful for understanding harness responsibilities at organizational scale.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tuwx-DmfXa2SlzmFZELPFg.png" /></figure><p>This does not mean ADK and Agent Platform are the same thing. ADK is a development framework; Agent Platform is a managed platform. You may still operate custom databases, tools, credentials, and reflection jobs yourself.</p><p>The useful point is the boundary: your agent behavior can be smaller when more of the operating machinery is handled by the harness.</p><h3>The boundary becomes real when agent number two arrives</h3><p>For one small agent, “agent versus harness” can feel conceptual. The same repository and team may own everything.</p><p>Then a second agent arrives.</p><p>Without a deliberate boundary, the new agent often receives its own:</p><ul><li>session implementation;</li><li>memory wiring;</li><li>authentication rules;</li><li>logging format;</li><li>retry behavior;</li><li>deletion workflow;</li><li>evaluation setup.</li></ul><p>Now two agents behave differently for reasons unrelated to their actual jobs.</p><p>A shared harness does not make agents identical. It makes common responsibilities consistent.</p><p>The support and billing agents can have different instructions, tools, and memory scopes while inheriting the same identity controls, trace format, memory lifecycle, and evaluation infrastructure.</p><p>That is where the boundary stops being philosophy and becomes architecture.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*F26l1v9XsWHPiqL_ZGwISw.png" /></figure><h3>Ask a better design question</h3><p>Instead of asking:</p><blockquote><em>Is this feature part of the agent or part of the harness?</em></blockquote><p>ask:</p><blockquote><em>Is this behavior specific to one agent’s job, or is it operating machinery that should remain consistent across agents and sessions?</em></blockquote><p>Agent-specific concerns often include goals, domain instructions, task tools, and agent-specific evaluations.</p><p>Harness concerns often include execution, tool dispatch, persistence, memory lifecycle, identity, authorization, recovery, logging, tracing, and shared evaluation infrastructure.</p><p>There will always be overlap. The goal is not a perfectly pure boundary. The goal is to prevent every new agent from rebuilding the same operational foundation.</p><p>For reflective memory, the agent can participate in deciding what was learned. The harness ensures the resulting memory is stored, governed, maintained, and available when a future interaction needs it.</p><p>The agent decides what job it is trying to do. The harness makes that job durable, governed, observable, and reusable.</p><p>The next post turns that boundary into a concrete architecture.</p><p><em>This is Part 3 of a five-part series on building an AI agent with reflective memory on Google Cloud.</em></p><p><strong>Next: Part 4 — Designing an AI Harness With Reflective Memory</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7067e64d20a3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/ai-agent-vs-ai-harness-where-memory-actually-lives-7067e64d20a3">AI Agent vs. AI Harness: Where Memory Actually Lives</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Orchestrating with Antigravity: A Crescendo of Agents (Part 1)]]></title>
            <link>https://medium.com/google-cloud/orchestrating-with-antigravity-a-crescendo-of-agents-part-1-b708b132b8a9?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/b708b132b8a9</guid>
            <category><![CDATA[kids-and-tech]]></category>
            <category><![CDATA[agy]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[ai-agents-in-action]]></category>
            <category><![CDATA[google-antigravity]]></category>
            <dc:creator><![CDATA[Riccardo Carlesso]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 02:15:36 GMT</pubDate>
            <atom:updated>2026-06-19T02:15:35.293Z</atom:updated>
            <content:encoded><![CDATA[<p>I’m a command-line guy. If it doesn’t run in a 🖥️ terminal or get driven by a bash script, I usually avoid it. For years, my daily workflow revolved around gemini-cli, and recently the newer antigravity-cli (agy). I avoided desktop apps and GUI tools like the plague (with the only exception of vscode); a friend calls people like me <em>BashOps</em> — the opposite of the perfectly reasonable <em>ClickOps</em> folks who prefer GUIs.</p><p>But recently, I hit a wall.</p><h3>This article series</h3><p>As I scaled up my AI agent workflows — managing multiple concurrent coding agents, multi-turn stateful loops, and file changes — babysitting 6 to 12 terminal windows across six virtual desktops became a cognitive nightmare. This is the story of that failure, and the learnings that followed. It is a story in two parts:</p><ol><li><strong>Part 1 (This Article)</strong>: Trying to solve agent persistence programmatically via the <strong>Antigravity Managed Agents</strong> and agy CLI, and encountering the crescendo of complexity.</li><li><strong>Part 2</strong>: Hitting the CLI limit and stepping into the <strong>Antigravity 2.0 UI / Desktop app</strong> to orchestrate parallel local subagents safely with git worktrees.</li><li><em>A part 3 is currently in my brain where I tell the story of how I conceived Ennio Morricone (greatest Italian conductor — see the analogy?) </em><em>agy CLI helper</em>.</li></ol><p>In this first part, we will explore how stateful remote sandboxes work under the hood using the Google GenAI SDK (antigravity-preview-05-2026), how to re-attach to container environments, and how to programmatically retrieve your agent workspace.</p><p>This first part builds on the foundation laid out in Romin Irani’s excellent <a href="https://medium.com/google-cloud/antigravity-managed-agents-tutorial-ship-production-ai-agents-b5917844932b">Antigravity Managed Agents Tutorial</a> and Phil Schmid’s deep dive into <a href="https://www.philschmid.de/how-managed-agents-work">how Managed Agents work under the hood</a>. I spent a day playing around with Romin’s article code ideas, customizing them to my own setups, and this article is the output of those experiments. While their articles focus on the architectural and hosted aspects of managed agents, we will look at how a developer can drive stateful remote sandboxes programmatically to build automation loops directly from a local terminal shell.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GscXvhXf2wVAv__Q.png" /><figcaption><em>Riccardo playing with Stateful Remote Sandboxes, after reading Romin’s article</em></figcaption></figure><h3>Antigravity Agents: a Stateful delight</h3><p>In a traditional agent API interaction, each call is stateless. You send a prompt, the agent responds, and the workspace disappears. If you want the agent to edit a file it created in a previous turn, you have to pass the entire file content back and forth in the prompt context. This consumes tokens, increases latency, and makes multi-turn code generation slow and expensive.</p><p>The Google Antigravity SDK solves this with <strong>Stateful Remote Sandboxes</strong>. When you run an agent with the environment parameter set to &quot;remote&quot;, the SDK:</p><p>1. Provisions a private, secure Ubuntu container (sandbox) on Google Cloud.</p><p>2. Runs the agent inside that container.</p><p>3. Keeps the container alive and returns an environment_id.</p><p>4. Allows subsequent API calls to re-attach to the same container, inheriting the exact filesystem state.</p><p>You don’t believe me? Let me show you the code (heavily inspired by <a href="https://medium.com/google-cloud/antigravity-managed-agents-tutorial-ship-production-ai-agents-b5917844932b">Romin’s article</a>).</p><h3>The SpaceX IPO Analyzer: Python Orchestration</h3><p>To demonstrate this capability, let’s write a Python script that orchestrates a stateful, multi-turn agent session.</p><p>A few days back, SpaceX made the news as the biggest IPO in history, making Elon Musk the first Trillionaire in history (<a href="https://www.reuters.com/business/media-telecom/spacex-ipo-makes-elon-musk-worlds-first-trillionaire-2026-06-11/">Reuters, June 2026</a>). Everyone is thinking: should I buy? Should I not? Let’s put Gemini to the test.</p><p>Our agent acts as a <strong>SpaceX IPO Analyzer</strong>. In the first turn, it researches the SpaceX IPO and generates a Markdown report. In the second turn, it re-attaches to the same container, reads the Markdown report, converts it into a styled HTML dashboard (with custom CSS), and generates a space-themed image asset. Finally, in the third turn, it programmatically downloads the entire workspace container snapshot.</p><p>&gt; 💡 <em>Note: The Antigravity stateful features are accessed using the standard Google GenAI Python SDK by calling the preview agent model (</em><em>antigravity-preview-05-2026) with </em><em>environment=&quot;remote&quot;.</em></p><p>Here is the complete python script:</p><pre>import os<br>import requests<br>import tarfile<br>from google import genai<br><br>client = genai.Client()<br>print(&quot;🚀 Turn 1: Launching SRE/Financial Agent in remote Ubuntu Sandbox...&quot;)<br># Turn 1: Launch agent to research and write a report in a remote sandbox<br>interaction_1 = client.interactions.create(<br>    agent=&quot;antigravity-preview-05-2026&quot;,<br>    input=&quot;Research SpaceX IPO and save report as spacex-report.md.&quot;,<br>    environment=&quot;remote&quot;  # Launches a remote Ubuntu sandbox<br>)<br>env_id = interaction_1.environment_id<br>print(f&quot;✅ Turn 1 Complete. Container Environment ID: {env_id}&quot;)<br><br>print(&quot;\n🔄 Turn 2: Re-attaching to same container and converting to HTML...&quot;)<br># Turn 2: Re-attach to the SAME sandbox and preserve conversation memory<br>interaction_2 = client.interactions.create(<br>    agent=&quot;antigravity-preview-05-2026&quot;,<br>    environment=env_id,                              # ← Re-attaches to same sandbox<br>    previous_interaction_id=interaction_1.id,       # ← Preserves conversation memory<br>    input=&quot;Convert that spacex-report.md file into a clean index.html webpage&quot; +<br>          &quot; with styling and generate a custom nanobanana image.&quot;<br>)<br>print(&quot;✅ Turn 2 Complete.&quot;)<br><br>print(&quot;\n📦 Turn 3: Downloading the entire container snapshot (.tar) locally...&quot;)<br># Turn 3: Download the entire sandbox environment state (.tar) locally<br>api_key = os.environ.get(&quot;GEMINI_API_KEY&quot;)<br>response = requests.get(<br>    f&quot;https://generativelanguage.googleapis.com/v1beta/files/environment-{env_id}:download&quot;,<br>    params={&quot;alt&quot;: &quot;media&quot;},<br>    headers={&quot;x-goog-api-key&quot;: api_key},<br>)<br>tar_path = &quot;snapshot_env.tar&quot;<br>with open(tar_path, &quot;wb&quot;) as f:<br>    f.write(response.content)<br>print(f&quot;✅ Snapshot downloaded to {tar_path}. Extracting...&quot;)<br>with tarfile.open(tar_path) as tar:<br>    tar.extractall(path=&quot;./workspace_extract&quot;)<br># Wow! We&#39;ve dumped the remote agent workspace locally!<br>print(&quot;🎉 Workspace extracted successfully! Check ./workspace_extract/&quot;)</pre><p>Let’s unpack what just happened in this code:</p><p>1. <strong>Spin up: Investigation</strong>. Google creates a docker container on a Ubuntu machine somewhere, and this instance <em>with REAL disk</em> starts doing some research on SpaceX IPO.</p><p>2. <strong>Continuation: format Conversion</strong>. Convert MD to HTML. This is silly — we could have done an HTML in iteration 1 of course — but it serves the purpose to demonstrate you can park your calculation today and come back tomorrow and <strong>continue the session</strong> and iterate over it, maybe with a chat over Telegram ;)</p><p>3. <strong>Pull results locally</strong> This is the magical part: git pull remote-workspace. This is where we know it&#39;s REAL. There&#39;s a real workspace there, maybe with some remote github repo pulled and some added Unit Tests. In our case, it contains <strong>spacex-report.md</strong> (created in turn 1), <strong>index.html</strong> and <strong>nanobanana.jpg</strong> (The space-themed HTML dashboard created in Turn 2), finally a CSS to make all very nice and space-themed.</p><p>This is what I see opening <strong>index.html</strong> with my browser:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4CpJtlLyuvyvomrQ.png" /><figcaption><em>Page 1 of the generated SpaceX IPO analysis dashboard.</em></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Z5715f9fQNJHUbKn.png" /><figcaption><em>Page 2 of the generated financial dashboard, displaying the bull/bear investment case.</em></figcaption></figure><p>Wow!</p><h4>Experiment 2: watch me coding (pun intended!)</h4><p>My son is great at Math. Nearly as good as <em>papino</em>. However, he struggles with watches.</p><p>After watching <em>Heroes</em>, I’ve always been a bit wary of watchmakers (especially <a href="https://www.youtube.com/watch?v=MqIf3ysYPmg">Sylar</a>). But recently, I spent a whole day helping my 8-year-old son struggle to map an analog clock pointing at 19:45 to its digital string representation. It was frustrating because he is actually fantastic at math — once he can work with digital time strings, he can calculate time differences like 08:45 +/- 20 minutes in seconds. The blocker was entirely visual.</p><p>So, I decided to build a game to help kids bridge this gap. The goal was to build orologia.io—a cross-platform mobile game built in Flutter.</p><p>This is because we travel a lot, and I need apps working on my Android on a plane.</p><p>A catchy name, that’s the easy part! <a href="https://github.com/palladius/orologia.io">orologia.io</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*04jgqvC_X2vhLFMD.png" /><figcaption><em>Since the ‘.com’ era is so 2000s, and the Sardinian ‘.io’ era is now!</em></figcaption></figure><p>Here is how we used a single stateful agent script to build the initial prototype. We passed a detailed multi-step prompt to the agent — asking it to read docs/PRD.md, implement the game, run a local server, take a screenshot, and file a GitHub PR.</p><p>Here is the core logic we used to run this stateful agent loop. It uses the google-genai SDK to provision the remote sandbox, mounts the orologia.io git repository, and downloads/extracts the final workspace snapshot.</p><p>Here is the core API setup, repository mounting, and snapshot download sequence (complete <a href="https://github.com/palladius/orologia.io/blob/main/solutions/20260615-antigravity-managed-agents/run-agent-prototype.py">run-agent-prototype.py</a> script <a href="https://github.com/palladius/orologia.io/blob/main/solutions/20260615-antigravity-managed-agents/run-agent-prototype.py">here</a> ):</p><pre>from google import genai<br>import requests, os<br><br>client = genai.Client()<br>api_key    = os.environ[&quot;GEMINI_API_KEY&quot;]<br>gh_token   = os.environ.get(&quot;GITHUB_TOKEN&quot;)  # optional: enables the agent to push a PR<br><br># Mount the git repo AND inject the GitHub token as a file into the sandbox<br>sources = [<br>    {&quot;type&quot;: &quot;repository&quot;,<br>     &quot;source&quot;: &quot;https://github.com/palladius/orologia.io&quot;,<br>     &quot;target&quot;: &quot;/workspace&quot;},<br><br>    {&quot;type&quot;: &quot;inline&quot;,<br>     &quot;target&quot;: &quot;/workspace/.github_token&quot;,<br>     &quot;content&quot;: gh_token},  # ← secret injection!<br>]<br># The prompt tells the agent exactly what to build<br>prompt = &quot;&quot;&quot;<br>You are an expert full-stack developer agent.<br><br>The repo orologia.io is mounted at /workspace.<br>1. Read docs/PRD.md and implement a beautiful clock-learning game...<br>2. Make it stunning: analog clock with rotating hands, digital display, ..<br>3. Optionally screenshot it, then commit and open a PR using the token <br>   at /workspace/.github_token.<br>&quot;&quot;&quot;  # Full prompt: https://github.com/palladius/orologia.io/blob/main/solutions/20260615-antigravity-managed-agents/run-agent-prototype.py<br># Launch remote stateful sandbox agent<br>interaction = client.interactions.create(<br>    agent=&quot;antigravity-preview-05-2026&quot;,<br>    input=prompt,<br>    environment={&quot;type&quot;: &quot;remote&quot;, &quot;sources&quot;: sources}<br>)<br># Download final snapshot locally<br>url = ...<br>response = requests.get(url, headers={&quot;x-goog-api-key&quot;: api_key}, params={&quot;alt&quot;: &quot;media&quot;})</pre><p>Rather than jumping straight into a complex Flutter mobile app, we had the agent create a rapid “vibe-coded” prototype in plain HTML, CSS, and JavaScript. By describing the clock mechanics and visual feedback loop in a single turn, the agent generated a responsive clock app in one minute.</p><ul><li><strong>Vibe-Coded Prototype Code</strong>: <a href="https://github.com/palladius/orologia.io/tree/main/solutions/20260615-antigravity-managed-agents">solutions/20260615-antigravity-managed-agents/</a></li><li><strong>Clock UI Draft</strong>: The agent designed interactive options, matching analog times to multiple digital buttons (you can view early drafts like <a href="https://github.com/palladius/orologia.io/blob/main/docs/ricc_draft.jpg">orologia_ui_one_clock_four_bcds.png</a>).</li><li>You can play the final game yourself here: <a href="https://palladius.github.io/orologia.io/">palladius.github.io/orologia.io</a></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*i_9xWqvHD0gBUQrp.png" /><figcaption><em>You can play the game under </em><a href="https://palladius.github.io/orologia.io/"><em>https://palladius.github.io/orologia.io/</em></a><em> !</em></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5_gKX1sQdRUPKg96.png" /><figcaption><em>And here is Alessandro winning the game!</em></figcaption></figure><p>This proved the value of single-agent rapid prototyping. But what happens when you try to scale past a single prototype and orchestrate multiple subagents concurrently to implement the full-blown cross-platform Flutter mobile game?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JbcefJGi03Mew2CH.png" /></figure><p><em>Riccardo surrounded by a million agents and being desperate</em></p><p><strong>This</strong> is where I hit the wall and resolved to invent a Worktree + Conductor Carlessian-customized workflow…. but this is for another article… 🚀 <a href="https://ricc.rocks/en/posts/technology/2026-06-16-crescendo-of-agents-part-2/">Orchestrating with Antigravity: A Crescendo of Agents (Part 2)</a></p><h3>What are these Remote Agents good for?</h3><p>So the big question is: <strong>What are these Remote Agents good for?</strong></p><p>You could argue that <em>everything is more comfortable in localhost</em>,</p><p>but I see this as a pioneering of the “agents Dockerfiles&quot; where you start playing with something locally, then a piece at a time you</p><p>start building your own “agent container” with bin/custom-script and .gemini/my-smart-config and maybe a gcloud ServiceAccount sa.json and</p><p>boom! You have a repeatable, secure, self-contained sendbox where you can interact with the Internet with the power of Gemini! Remember, git clone and API_KEYS are a powerfule combination!</p><p>My personal <strong>key takeaways</strong>:</p><ul><li>Do NOT use for a one-off investigation. Use Web or local CLI instead, it’s much faster.</li><li>Use for repeatable workflows where the config takes a lot more than the final prompt. In other words, anything where you have 5 prompts of which 1–2–3–4 are the same, and 5 always changes. This is IMHO the sweet spot where these excel.</li><li>Try Gemini API CLI excellently explained in <a href="https://www.philschmid.de/gemini-managed-agents-developer-guide">Philip&#39;s article</a>.</li></ul><p><em>Example</em>: I’m currently working on containerizing a travel planner for my family where I just say the trip I want to plan, when and the constraints. Yes, it feels like a fine-tuned model, but fully FS observable/tweakable, so I can download the index.html later on!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*G0lnhD0xSHdgmJ3g.png" /></figure><p><em>The agent built a full Sardinia travel plan — with a flight proof and an itinerary map — from a three prompts (1 and 2 are constant), and with provable flight booking links.</em></p><p>—</p><p>🚀 <strong>Ready for Part 2?</strong> Read <a href="https://ricc.rocks/en/posts/technology/2026-06-16-crescendo-of-agents-part-2/">Orchestrating with Antigravity: A Crescendo of Agents (Part 2)</a> to see how we scale this local development flow using git worktrees, Conductor++, and parallel subagents under Agostina.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b708b132b8a9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/orchestrating-with-antigravity-a-crescendo-of-agents-part-1-b708b132b8a9">Orchestrating with Antigravity: A Crescendo of Agents (Part 1)</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building an agentic PR reviewer with Antigravity SDK]]></title>
            <link>https://medium.com/google-cloud/building-an-agentic-pr-reviewer-with-antigravity-sdk-b22aac8956b4?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/b22aac8956b4</guid>
            <category><![CDATA[gemini-cli]]></category>
            <category><![CDATA[google-antigravity]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[github-actions]]></category>
            <dc:creator><![CDATA[Remigiusz Samborski]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 19:32:40 GMT</pubDate>
            <atom:updated>2026-06-18T19:32:38.838Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Antigravity reviewing GitHub PRs" src="https://cdn-images-1.medium.com/max/1024/1*3DAm99ZedUuxaOw5ejmNDg.png" /></figure><p>As announced in this <a href="https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/?utm_campaign=CDR_0x87fa8d40_default_b517845989&amp;utm_medium=external&amp;utm_source=blog">blog post</a> on June 18, 2026, Gemini CLI and Gemini Code Assist IDE extensions will stop serving requests for Google AI Pro and Ultra, as well as those using it free of charge using Gemini Code Assist for individuals. Google is unifying its AI terminal tools by transitioning the community-focused Gemini CLI into Antigravity CLI, a new agent-first platform built for complex, multi-agent workflows.</p><p>With this transition timeline in place, development teams relying on Gemini CLI for repository management and automated tasks must establish a migration path. In this post, I will show you how to transition seamlessly by building an automated “first-pass” pull request reviewer using the Google <a href="https://antigravity.google/product/antigravity-sdk?utm_campaign=CDR_0x87fa8d40_default_b517845989&amp;utm_medium=external&amp;utm_source=blog">Antigravity SDK</a> and the <a href="https://github.com/rsamborski/run-agy-sdk">run-agy-sdk</a> composite <a href="https://github.com/features/actions">GitHub Action</a>.</p><h3>The orchestration tax</h3><p>The approach I am proposing also solves another pressing issue for modern engineering teams: cognitive overload. As <a href="https://x.com/addyosmani">Addy Osmani</a> recently pointed out, there is an <a href="https://x.com/addyosmani/status/2059844244907696186">orchestration tax</a> to using AI for coding. The time developers save generating code is often pushed onto reviewers as large, complex PRs, causing context switching and cognitive fatigue.</p><blockquote><em>By offloading the tedious “first pass” search to an Antigravity agent, human reviewers can mitigate this tax and focus on high-level architecture and safeguarding quality.</em></blockquote><h3>Why we need automated agentic code reviews</h3><p>AI-generated code can be deceptively good. It is often clean, well-documented, and syntactically correct. This makes it harder for human reviewers to spot subtle logical bugs or security vulnerabilities that might not be immediately obvious.</p><p>In a large codebase, manually verifying every change is simply not feasible. This is why we need autonomous agents that can step into the codebase and analyze it from a fresh perspective.</p><p>But if a developer used an LLM to generate the code, how can we trust another AI to find the bugs? The answer lies in the agent architecture and context separation.</p><p>Developers might write code using any tool — whether it’s CLI, an IDE extension, or various models like Gemini 3.5 Flash or Gemini 3.1 Pro. The reviewer, however, is a managed Antigravity Agent running via a separate SDK integration. This agent has a specialized, low-freedom persona and strict system instructions that force it to act as an adversarial code auditor rather than a developer. Furthermore, it operates in an isolated environment. Because it has a different system prompt, safety guardrails, and context boundaries, the agent reviews the changes with a completely fresh perspective, catching logical bugs and vulnerabilities that the original generator might miss.</p><p>To demonstrate it in practice I created an agentic review pipeline, which:</p><ol><li>Leverages a managed <a href="https://ai.google.dev/gemini-api/docs/antigravity-agent?utm_campaign=CDR_0x87fa8d40_default_b517845989&amp;utm_medium=external&amp;utm_source=blog">Antigravity Agent</a> configured via the SDK to review the code. The agent uses advanced reasoning to explore files and verify logic under strict guidelines.</li><li>Runs reviews inside isolated workspaces or sandboxes with custom policies to prevent shell or arbitrary code execution risks.</li><li>Enables the agent to use the GitHub MCP server to interact directly with the environment to write pull request comments and reviews.</li><li>Avoids using the synchronize trigger in pull request workflows to prevent redundant review runs and endless loops. Instead, runs reviews on opened and reopened events, and triggers subsequent passes manually by posting a @agy /review comment on the PR.</li></ol><figure><img alt="Agentic review pipeline" src="https://cdn-images-1.medium.com/max/1024/1*G9VMOR_eCEp_PsdKlPw-Kw.png" /><figcaption>Agentic review pipeline</figcaption></figure><p>You can find the code at <a href="https://github.com/rsamborski/run-agy-sdk">run-agy-sdk</a>.</p><h3>What is run-agy-sdk?</h3><p>The <a href="https://github.com/rsamborski/run-agy-sdk">run-agy-sdk</a> is a composite GitHub Action that runs the Google Antigravity SDK (google-antigravity) directly on the GitHub Actions host runner.</p><h3>Why run on the host instead of a container?</h3><p>By running directly on the host, the Antigravity SDK has access to the host’s Docker daemon. This allows the SDK to spawn Docker-based MCP servers (like the GitHub MCP server) to read files, run tests, and post reviews.</p><p>Sub-containers should ideally run with restricted network access and read-only filesystems where possible to prevent an LLM from being tricked into executing arbitrary destructive commands. The limited set of permissions is handled in the GitHub Action configuration (<a href="https://github.com/rsamborski/run-agy-sdk/blob/da0ff77fc9dfc82e5ad89a430bc51476aeb8f867/.github/workflows/antigravity-autonomous-review.yml#L33">see here</a>). Whereas the Antigravity agent has a limited number of tools it can use from GitHub MCP (<a href="https://github.com/rsamborski/run-agy-sdk/blob/da0ff77fc9dfc82e5ad89a430bc51476aeb8f867/run_agent.py#L160-L161">see here</a>).</p><p>Moreover the workflow is explicitly protected from running automatically on forks, preventing unauthorized code execution. The automated review job will only run if the pull request originates from the same repository (<a href="https://github.com/rsamborski/run-agy-sdk/blob/da0ff77fc9dfc82e5ad89a430bc51476aeb8f867/.github/workflows/antigravity-autonomous-review.yml#L45">see here</a>). On-demand reviews triggered by commenting @agy /review are restricted so that they can only be initiated by maintainers (<a href="https://github.com/rsamborski/run-agy-sdk/blob/da0ff77fc9dfc82e5ad89a430bc51476aeb8f867/.github/workflows/antigravity-autonomous-review.yml#L59-L61">see here</a>).</p><h3>Demonstration walkthrough</h3><p>The demo below shows the action triggered by a new PR:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F30-LS9YnY_g%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D30-LS9YnY_g&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F30-LS9YnY_g%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/430b9cd6cc3049a213ab3e0b49e23ed5/href">https://medium.com/media/430b9cd6cc3049a213ab3e0b49e23ed5/href</a></iframe><h3>Implementation: How to install the action in your repo</h3><p>Let’s walk through the setup process step-by-step.</p><h3>Step 1: Add your API key to GitHub secrets</h3><p>The action requires a Google Gemini or Antigravity API key to authenticate language model interactions.</p><ol><li><a href="https://aistudio.google.com/api-keys">Generate your API key</a>.</li><li>Navigate to your target GitHub repository and go to <strong>Settings</strong> &gt; <strong>Secrets and variables</strong> &gt; <strong>Actions</strong>.</li><li>Create a new Repository Secret named ANTIGRAVITY_API_KEY and paste your API key as the value.</li></ol><h3>Step 2: Configure the GitHub Actions workflow</h3><p>Add a new file in your repository at .github/workflows/antigravity-review.yml and add the following configuration:</p><pre>name: &#39;🔎 Antigravity PR Review&#39;<br><br>on:<br>  pull_request:<br>    types: [opened, reopened]<br>  workflow_dispatch:<br><br>concurrency:<br>  group: &#39;${{ github.workflow }}-${{ github.event.pull_request.number || github.ref_name }}&#39;<br>  cancel-in-progress: true<br><br>jobs:<br>  antigravity-review:<br>    runs-on: &#39;ubuntu-latest&#39;<br>    timeout-minutes: 20<br>    <br>    permissions:<br>      contents: &#39;read&#39;<br>      pull-requests: &#39;write&#39;<br>      issues: &#39;write&#39;<br><br>    steps:<br>      - name: &#39;Checkout Repository&#39;<br>        uses: &#39;actions/checkout@v6&#39;<br>        with:<br>          persist-credentials: false<br><br>      - name: &#39;Run Antigravity PR Review&#39;<br>        uses: &#39;rsamborski/run-agy-sdk@main&#39;<br>        id: &#39;agy_pr_review&#39;<br>        with:<br>          api-key: &#39;${{ secrets.ANTIGRAVITY_API_KEY }}&#39;<br>          github-token: &#39;${{ secrets.GITHUB_TOKEN }}&#39;<br>          mode: &#39;review&#39;<br>          prompt: &#39;/antigravity-review&#39;<br>          trust-workspace: &#39;true&#39;<br>          sandbox-profile: &#39;true&#39;</pre><p><strong>Pro Tip:</strong> Pin the action version to a specific commit SHA (e.g., rsamborski/run-agy-sdk@&lt;commit-sha&gt;) rather than using @main. This prevents unexpected breaks from upstream updates.</p><p>While you can reference run-agy-sdk directly in your workflows, its real power lies in using it as a blueprint. I encourage you to <a href="https://github.com/rsamborski/run-agy-sdk">fork the repository</a> and use it as a template to build your own custom, agentic GitHub Actions. By modifying the safety policies, custom tools, or prompts in run_agent.py, you can tailor the agent’s review behavior to your team’s specific codebase, style guidelines, and compliance rules.</p><p>For a full workflow template supporting both automated PR reviews and comment-triggered reviews, refer to the <a href="https://github.com/rsamborski/run-agy-sdk/blob/main/.github/workflows">workflows</a> folder in the repository.</p><h3>Conclusions</h3><p>Automating code reviews is a necessity as AI-generated code volumes increase. By using run-agy-sdk, you can run the Antigravity SDK to review PRs automatically and shift more of the burden of code quality assurance away from human reviewers.</p><ul><li>Access the full source code in the <a href="https://github.com/rsamborski/run-agy-sdk">GitHub Repository</a>.</li><li>Read the documentation to customize the prompts and mode.</li><li>Feel free to fork the repository and build your own automation.</li></ul><h3>Acknowledgments</h3><p>This project was inspired by the <a href="https://github.com/google-github-actions/run-gemini-cli">run-gemini-cli</a> action, while shifting to the recently released Antigravity SDK. It is a personal sample implementation of how to run the Antigravity SDK in a GitHub Action, and is not an officially supported Google product.</p><h3>Let’s connect!</h3><p>I’d love to hear how you’re using Antigravity for your agentic workflows. Are you building automated code review loops or keeping a tighter leash on your agents?</p><ul><li>Connect with me on <a href="https://www.linkedin.com/in/remigiusz-samborski/">LinkedIn</a></li><li>Follow me on <a href="https://x.com/RemikSamborski">X</a></li><li>Catch me on <a href="https://bsky.app/profile/rsamborski.bsky.social">Bluesky</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b22aac8956b4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-an-agentic-pr-reviewer-with-antigravity-sdk-b22aac8956b4">Building an agentic PR reviewer with Antigravity SDK</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Next Era of Conversational AI: An Introduction to Gemini Enterprise CX and CX Agent Studio]]></title>
            <link>https://medium.com/google-cloud/the-next-era-of-conversational-ai-an-introduction-to-gemini-enterprise-cx-and-cx-agent-studio-7b9bf9cb0b45?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/7b9bf9cb0b45</guid>
            <category><![CDATA[dialogflow-cx]]></category>
            <category><![CDATA[gemini-enterprise-cx]]></category>
            <category><![CDATA[conversational-ai-chatbot]]></category>
            <category><![CDATA[cx-agent-studio]]></category>
            <category><![CDATA[google-adk]]></category>
            <dc:creator><![CDATA[Pramodkumar Gupta @ Google]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 03:09:10 GMT</pubDate>
            <atom:updated>2026-06-18T03:09:09.417Z</atom:updated>
            <content:encoded><![CDATA[<p>Throughout my career as a conversational AI architect, I’ve designed countless intricate chatbot structures. If you build chatbots, you probably remember the old way of doing things: creating endless flowcharts, guessing what users might say, and fighting with system limits in tools like Dialogflow. That used to be the best we had. But the AI world has completely changed. We aren’t just programming basic, robotic responses anymore; we are building smart, independent AI assistants.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0W2Lqb4VSCQtUe9Czyd20Q.jpeg" /></figure><p>Welcome to <strong>Gemini Enterprise for Customer Experience (GECX)</strong> and its crown jewel: <strong>CX Agent Studio</strong>. Let’s dive into why this platform is completely changing how we build chatbots and voicebots in 2026.</p><h3>A Brief History of Conversational AI</h3><p>To appreciate the leap forward that GECX represents, we have to look back at how we got here:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7sE2fYwnW-dgtnyGgGwIgg.jpeg" /></figure><p><strong>Generation 1: Rule-Based Bots:</strong> Rigid, keyword-driven IVR trees. If the user deviated slightly from the script, the bot broke, resulting in a frustrating loop of “I didn’t quite get that.”</p><p><strong>Generation 2: Intent-Based NLU (Dialogflow ES/CX, AWS Lex):</strong> A massive leap forward. Natural Language Understanding (NLU) allowed bots to extract intents and entities. However, scaling enterprise bots required massive flow charts that often hit hundreds of pages. They became incredibly difficult to maintain and visually resembled a tangled web.</p><p><strong>Generation 3: Generative &amp; Agentic AI (CX Agent Studio):</strong> The current frontier. Instead of predicting every possible turn of a conversation, we define an agent’s <em>persona, tools, and goals</em>. The LLM dynamically reasons and orchestrates the conversation to achieve the desired outcome.</p><h3>The Market Landscape: Where Does Google Sit?</h3><p>The enterprise conversational AI market is highly competitive. We have established Hyperscalers like <strong>AWS (Lex)</strong>, <strong>Microsoft Azure (Bot Service)</strong>, and <strong>IBM Watson</strong>, alongside specialized CCaaS vendors. However, Google Cloud has historically dominated developer mindshare with Dialogflow ES/CX.</p><p>With GECX, Google isn’t just releasing a version bump; they are redefining the category by deeply embedding the <strong>Gemini 3 model family</strong> into an enterprise-grade wrapper. It takes the generative capabilities of modern LLMs and wraps them in the deterministic guardrails that enterprises demand.</p><h3>Why GECX and CX Agent Studio Are Leading the Pack</h3><p>CX Agent Studio abandons the “flows and intents” paradigm and adopts an architecture based on <strong>agents, subagents, and tools</strong>. Here are the standout features that make it a game-changer for developers:</p><h4>1. Visual Subagent Orchestration</h4><p>Instead of managing a literal web of 300 pages, CX Agent Studio offers a clean visual UI to structure subagents. You can define one specialized agent for “Order Tracking,” another for “Returns,” and a “Routing” agent to seamlessly orchestrate between them. It’s highly modular and infinitely more scalable.</p><h4>2. True Multimodal Support</h4><p>We aren’t just dealing with text anymore. GECX supports text, audio, and image inputs natively. With direct audio-to-audio (A2A) translation in 10+ core languages and human-like voices in over 40 languages, you can deploy a highly responsive voicebot with near-zero latency.</p><h4>3. Tool Connectors &amp; Deterministic Control</h4><p>LLMs hallucinate, but enterprise systems cannot. CX Agent Studio allows you to securely wrap external APIs using Python tools, OpenAPI, or the Model Context Protocol (MCP). This “Context Engineering” ensures the agent only sees relevant JSON data, which reduces reasoning time and keeps conversations strictly grounded in factual business data.</p><h4>4. Global Variables &amp; State Management</h4><p>State management has historically been one of the messiest parts of building conversational interfaces. Now, there’s a dedicated page to manage global variables across your entire agent structure, effectively treating session state as a first-class feature rather than an afterthought.</p><h4>5. Built-in Evaluations and Previews</h4><p>Anyone who suffered through legacy simulators will appreciate this. The testing environment allows you to see the agent’s internal reasoning and tool calls step-by-step. Furthermore, automated evaluation pipelines allow you to catch regressions before deploying changes to production.</p><h3>Why the Industry is Rapidly Adopting It</h3><p>For businesses, the ROI is clear. Development time drops from weeks to mere days. By utilizing 35 ready-to-use templates and a low-code builder, teams can launch sophisticated AI with near-zero human engineering. Furthermore, native widget support allows companies to deploy rich business messaging — enabling instant transactions and product discovery — without needing a massive custom frontend build.</p><h3>Real-World Adoption: Who is Using GECX?</h3><p>Major enterprises and global systems integrators are already making the shift in 2026:</p><ul><li><strong>Retail &amp; E-commerce:</strong> Brands are deploying dedicated AI Shopping Agents that manage the entire journey from product discovery to checkout. These agents use complex reasoning to suggest products based on real-time inventory and process multimodal inputs (like a customer uploading a photo of a shoe they want).</li><li><strong>Global Systems Integrators:</strong> Tech giants have launched dedicated “Gemini Enterprise CX Practices,” actively hiring Practice Leads and Solution Architects to migrate massive legacy CCaaS architectures over to Google’s generative platform.</li><li><strong>High-Volume Contact Centers:</strong> By replacing legacy flow-based bots with CX Agent Studio, companies are providing zero-wait-time resolutions while simultaneously utilizing “Customer Experience Insights” to analyze conversations and Upskill human staff in real time.</li></ul><h3>Conclusion</h3><p>Building conversational AI is no longer about attempting to predict what a user might say; it’s about empowering an intelligent system to dynamically assist them. Gemini Enterprise CX and CX Agent Studio offer the perfect balance: the raw generative power and natural language fluency of the Gemini models, paired with the strict deterministic guardrails, tool orchestration, and observability required by the enterprise.</p><p>If you are still mapping out intents and dragging arrows between hundreds of pages, it’s time to rethink your architecture. The age of the autonomous, multi-modal enterprise agent is officially here.</p><p>Learn more about GECX : <a href="https://cloud.google.com/gemini-enterprise-cx">Click here</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7b9bf9cb0b45" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/the-next-era-of-conversational-ai-an-introduction-to-gemini-enterprise-cx-and-cx-agent-studio-7b9bf9cb0b45">The Next Era of Conversational AI: An Introduction to Gemini Enterprise CX and CX Agent Studio</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a 100% Serverless, Strictly Typed Data Platform on GCP]]></title>
            <link>https://medium.com/google-cloud/100-serverless-strictly-typed-event-driven-data-platform-on-gcp-235ad5a07352?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/235ad5a07352</guid>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[event-driven-architecture]]></category>
            <category><![CDATA[data-processing]]></category>
            <dc:creator><![CDATA[Ben Mizrahi]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 03:08:59 GMT</pubDate>
            <atom:updated>2026-06-18T03:08:58.368Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>If you are building a mobile gaming studio, an ad-tech startup, or any heavily data-driven company, you face a critical bottleneck on day one: <strong>You need to get massive amounts of telemetry from your application into an analytical database fast, reliably, and cheaply.</strong></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rWGs-RLajq6ilyAGhV5LYg.png" /></figure><p>Most startups fall into one of two traps:</p><p><strong>Trap 1: The “Wild West” Data Lake.</strong> You dump unstructured JSON payloads directly into storage. It’s fast to build, but within a month, developers change a field name, downstream analytics break, and your data team spends 80% of their time fixing silent corruption.</p><p><strong>Trap 2: The Over-Engineered Behemoth.</strong> You deploy Kafka clusters, Kubernetes nodes, and dedicated stream processors. Suddenly, your infrastructure bill is in the thousands, and you need a dedicated DevOps engineer just to keep the lights on.</p><p>Startups don’t have time for either. What you actually need is an analytics platform that is <strong>strictly typed from the application all the way to the database, infinitely scalable, totally “No-Ops”, and aggressively cost-optimized.</strong></p><p>To solve this, I designed and open-sourced a complete, click-to-deploy, 100% serverless data platform on Google Cloud (GCP). In this article, I’ll break down how it works, the business benefits, and why this architecture is the ultimate cheat code for early to mid-stage startups.</p><p><em>(You can grab the complete Infrastructure-as-Code and start deploying right now from my GitHub repo: </em><a href="https://github.com/benmizrahi/gcp-data-platfrorm/tree/main"><em>benmizrahi/gcp-data-platform</em></a><em>)</em></p><h3>The Solution: A Click-to-Deploy Serverless Architecture</h3><p>The core philosophy of this platform is simple: <strong>Let the cloud provider do the heavy lifting.</strong> By wiring together GCP’s native serverless offerings, we create a pipeline that requires zero provisioning, scales instantly, and enforces data quality at the door.</p><p>Here is the anatomy of the solution:</p><ul><li><strong>Event Ingestion:</strong> Google Cloud Run (Serverless compute)</li><li><strong>The Event Backbone:</strong> Google Cloud Pub/Sub</li><li><strong>Schema Enforcement:</strong> Pub/Sub Native Schema Registry (Protocol Buffers / Apache Avro)</li><li><strong>The Analytical Database:</strong> Google BigQuery</li></ul><h3>1. Strictly Typed: From App to Database</h3><p>The most powerful feature of this platform is <strong>strict typing</strong>. In a data-driven business like ad-tech or gaming, a missing currency field or a malformed timestamp can ruin revenue reports.</p><p>In this architecture, events are defined using <strong>Protobuf</strong>. When your application sends an event, GCP Pub/Sub validates it natively against the schema <em>before</em> accepting it. If the payload is malformed, it is rejected with an error instantly. BigQuery then ingests this validated data perfectly. No broken dashboards, no silent failures, and complete confidence in your data.</p><h3>2. Ready-to-Use &amp; Extensible</h3><p>The entire platform is defined as Infrastructure-as-Code (Terraform). It is a true “click-to-deploy” solution. Furthermore, it relies on a Pub/Sub “fan-out” model. If you want to add a real-time fraud detection service down the line, you don’t touch the existing pipeline. You simply add a new serverless subscription to the existing topic. It is infinitely extensible without touching the core code.</p><h3>Analysis: Why This Wins for Startups</h3><p>Why choose this specific architecture over managed Kafka or traditional ETL tools? Let’s break down the tangible business benefits.</p><h3>Benefit 1: True “No-Ops” and Infinite Scale</h3><p>If your mobile game gets featured on the App Store and traffic spikes from 100 events a minute to 100,000 events a second, this platform won’t break a sweat.</p><ul><li>Cloud Run scales container instances from zero to thousands in milliseconds.</li><li>Pub/Sub handles massive throughput globally without you ever having to think about “partitions” or “brokers.”</li><li>BigQuery allocates query resources dynamically. You don’t need to wake up at 3 AM to scale up a database disk. The infrastructure adapts to your traffic instantly.</li></ul><h3>Benefit 2: Aggressively Cost-Optimized (The Pricing Model)</h3><p>When you are a startup, managing burn rate is everything. Traditional data infrastructure requires paying a baseline cost just to keep servers running, even if nobody is using your app at 4 AM.</p><p>This serverless architecture operates on a <strong>pure pay-for-what-you-use model:</strong></p><ul><li><strong>Compute (Cloud Run):</strong> You pay in increments of 100 milliseconds only when code is actively executing. <em>Scale to zero means $0 cost when idle.</em></li><li><strong>Messaging (Pub/Sub):</strong> You pay per gigabyte of data transmitted. GCP offers a generous free tier every month, meaning early-stage startups might pay pennies.</li><li><strong>Storage/Analytics (BigQuery):</strong> You pay for the data you store and the queries you run.</li></ul><p><strong>The Bottom Line:</strong> If you have zero traffic, your infrastructure bill is effectively $0. If your company goes viral, your costs scale linearly and predictably with your revenue-generating traffic.</p><h3>Benefit 3: Faster Time-to-Market</h3><p>Because this is a click-to-deploy solution, your engineering team isn’t spending weeks debating infrastructure. They deploy the Terraform scripts in minutes, generate their strongly-typed client code, and get back to building the actual product.</p><h3>Conclusion</h3><p>Building a data platform used to be a massive undertaking reserved for companies with dedicated data engineering teams and large budgets. Today, by leveraging serverless architecture and native cloud schema registries, you can achieve enterprise-grade reliability on a startup budget.</p><p>This architecture gives you the holy grail of data engineering: strict typing so your data is always accurate, infinite scale so you never drop an event, and zero-ops so your engineers can focus on product, not pipelines.</p><p>If you want to stop fighting your data infrastructure and start getting insights, check out the complete code and deployment guide here: <br><a href="https://github.com/benmizrahi/gcp-data-platfrorm/tree/main">🔗 <strong>Deploy the Platform on GitHub</strong></a></p><p><em>If this architecture helps your startup scale, feel free to drop a star on the repo or share how you’re using it in the comments!</em></p><p><strong>Happy Hacking :)</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=235ad5a07352" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/100-serverless-strictly-typed-event-driven-data-platform-on-gcp-235ad5a07352">Building a 100% Serverless, Strictly Typed Data Platform on GCP</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>