<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manan</title>
    <description>The latest articles on DEV Community by Manan (@manbee).</description>
    <link>https://dev.to/manbee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4107477%2Faaa21f48-845e-40e9-97c7-f65f27a9738c.png</url>
      <title>DEV Community: Manan</title>
      <link>https://dev.to/manbee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manbee"/>
    <language>en</language>
    <item>
      <title>Architecting a Closed-Loop Meta-Controller for Google Antigravity: Lessons from Turn Synchronization and Multimodal Vision</title>
      <dc:creator>Manan</dc:creator>
      <pubDate>Thu, 03 Sep 2026 07:18:47 +0000</pubDate>
      <link>https://dev.to/manbee/architecting-a-closed-loop-meta-controller-for-google-antigravity-lessons-from-turn-aen</link>
      <guid>https://dev.to/manbee/architecting-a-closed-loop-meta-controller-for-google-antigravity-lessons-from-turn-aen</guid>
      <description>&lt;p&gt;If you have experimented with autonomous coding agents like Google Antigravity, Devin-style systems, or agentic developer tools, you have likely encountered the autonomous coding wall:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Premature Halting: An agent hits a minor architectural ambiguity and pauses indefinitely, waiting for a human to type "continue" or "proceed".&lt;/li&gt;
&lt;li&gt;Context Drift and Terminal Loops: An agent fails a bash command or linter check, applies a localized patch that breaks another module, and enters a recursive error loop.&lt;/li&gt;
&lt;li&gt;The Prompt Stacking Race Condition: If you attempt to automate the agent from an external script by injecting prompts on timers, prompts inevitably collide with running tool executions, corrupting the prompt queue.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve this, I researched and built &lt;a href="https://github.com/Brubeee/ag-supervisor" rel="noopener noreferrer"&gt;AG Supervisor&lt;/a&gt; — an open-source closed-loop meta-controller that pairs Google Antigravity with an external reasoning model acting as an autonomous senior tech lead.&lt;/p&gt;

&lt;p&gt;In this article, I want to share the core engineering lessons, synchronization algorithms, and multimodal patterns learned while building this system in Python.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Core Architecture: The Supervisor Pattern
&lt;/h2&gt;

&lt;p&gt;Rather than running a single monolithic agent, the Supervisor Pattern separates execution from governance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execution Layer (Google Antigravity): Specializes in reading files, running terminal commands, editing ASTs, and invoking tools.&lt;/li&gt;
&lt;li&gt;Supervision Layer (Gemini 2.5 Flash / ChatGPT in Chrome): Sits outside the workspace, reviewing visual screenshots, ensuring adherence to the macro goal, and formulating the next concrete developer instruction.&lt;/li&gt;
&lt;li&gt;Coordination Engine: Syncs turns, debounces execution states, and injects instructions directly into Antigravity's DOM.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Solving the Turn Synchronization Race Condition
&lt;/h2&gt;

&lt;p&gt;The most fragile challenge in supervising desktop agents is knowing precisely when an agent has finished its turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Time-Based Polling Fails
&lt;/h3&gt;

&lt;p&gt;Polling every N seconds inevitably fails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A complex refactor or build script might take 45 seconds.&lt;/li&gt;
&lt;li&gt;A single-line file edit might take 1.5 seconds.&lt;/li&gt;
&lt;li&gt;If you inject while the agent is executing tools, keystroke collisions occur and execution state becomes corrupt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Solution: Step-Index Telemetry + Stability Debouncing
&lt;/h3&gt;

&lt;p&gt;Antigravity stores its operational trajectory locally in &lt;code&gt;~/.gemini/antigravity/brain/&amp;lt;conv_id&amp;gt;/.system_generated/logs/transcript.jsonl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We track the step index and query the DevTools Protocol (CDP) DOM state. Even after the agent signals readiness, there is often a micro-turn between tool execution and final token generation. Instituting a mandatory 1.5-second stability debounce eliminated 100% of stacked or dropped prompts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_is_running&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;turn_done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;curr_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_latest_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conv_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cur_step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curr_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step_index&lt;/span&gt;
    &lt;span class="n"&gt;dom_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_turn_status_cdp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cur_step&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;baseline_step_index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;is_idle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curr_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_turn_finished&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;dom_status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_input_ready&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;dom_status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Enforce 1.5s stability debounce
&lt;/span&gt;            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;confirm_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_turn_status_cdp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;confirm_status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;turn_done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Multimodal Visual Grounding vs. Text Diffs
&lt;/h2&gt;

&lt;p&gt;Autonomous agents frequently declare a task complete because a shell script returned exit code 0. But in modern web development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code can compile with zero errors while the UI is completely unstyled or visually broken.&lt;/li&gt;
&lt;li&gt;Elements can overlap, CSS classes might fail to load from CDNs, or interactive event listeners may be unmounted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this, AG Supervisor captures the agent's full workspace window via CDP (&lt;code&gt;Page.captureScreenshot&lt;/code&gt;), downscales it to 1080p JPEG with Lanczos interpolation, and feeds it into the multimodal supervisor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screenshot_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resampling&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LANCZOS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPEG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;image_part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;mime_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The supervisor visually inspects whether components rendered cleanly in the browser before emitting the completion token (&lt;code&gt;&amp;lt;AG_COMPLETE&amp;gt;&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Dual Engines: Free API vs. Zero-API Chrome CDP
&lt;/h2&gt;

&lt;p&gt;We designed the supervisor to support two interchangeable reasoning engines:&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Gemini 2.5 Flash API (1–2s Turns)
&lt;/h3&gt;

&lt;p&gt;Google AI Studio offers a free tier of 15 Requests Per Minute (RPM) and 1,000,000 Tokens Per Minute (TPM).&lt;/p&gt;

&lt;p&gt;To ensure developers never hit rate limits, we implemented a strict 4.0-second throttle guard and exponential retry backoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_last_request_time&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B: Local Chrome CDP Automation (Zero API Keys)
&lt;/h3&gt;

&lt;p&gt;For developers without API keys or who want to use their existing ChatGPT Plus/Free accounts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chrome is launched with remote debugging:
&lt;code&gt;chrome.exe --remote-debugging-port=9222 --user-data-dir="%LOCALAPPDATA%\Google\Chrome\User Data\AGSupervisorProfile" https://chatgpt.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Playwright attaches to the browser over CDP:
&lt;code&gt;browser = await playwright.chromium.connect_over_cdp("http://127.0.0.1:9222")&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The supervisor uploads the desktop screenshot via the hidden file input, types into &lt;code&gt;#prompt-textarea&lt;/code&gt;, clicks send, and watches for the stop button to disappear.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Multi-Project Context Resolution
&lt;/h2&gt;

&lt;p&gt;If you have multiple workspaces open, how does an external supervisor know which project you are actively working on?&lt;/p&gt;

&lt;p&gt;In Antigravity's filesystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every conversation lives in &lt;code&gt;~/.gemini/antigravity/brain/&amp;lt;uuid&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We inspect the modification time (&lt;code&gt;st_mtime&lt;/code&gt;) of &lt;code&gt;transcript.jsonl&lt;/code&gt; across all directories. Whichever project is touched or receiving input automatically surfaces to the top.&lt;/li&gt;
&lt;li&gt;We also built a project picker dropdown in the Tkinter UI that parses the first user prompt and timestamps to give you an instant preview.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Real-World Results
&lt;/h2&gt;

&lt;p&gt;To test the system, we gave AG Supervisor a complex frontend objective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Build an interactive, visually stunning single-page website about potatoes with a dynamic recipe serving scaler, potato variety directory with starch meters, and a trivia quiz with confetti in &lt;code&gt;potato_website/index.html&lt;/code&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Across 3 synchronized turns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Phase 0: Gemini formulated the directory creation and Tailwind architecture.&lt;/li&gt;
&lt;li&gt;Iteration 1: Antigravity generated the single-page application.&lt;/li&gt;
&lt;li&gt;Iteration 2: Gemini visually audited the screenshot, instructed Antigravity to run verification commands, and issued the &lt;code&gt;&amp;lt;AG_COMPLETE&amp;gt;&lt;/code&gt; completion token.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The resulting web application was fully functional with reactive serving calculations, search filters, and interactive quizzes.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Try It Out (Open Source)
&lt;/h2&gt;

&lt;p&gt;The entire project is open-source under the MIT License.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Repository: &lt;a href="https://github.com/Brubeee/ag-supervisor" rel="noopener noreferrer"&gt;https://github.com/Brubeee/ag-supervisor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Includes full source code, 15 unit/integration tests, a Tkinter desktop GUI, headless CLI, and a 1-click Windows launcher (&lt;code&gt;run.bat&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quickstart:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone repository&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://github.com/Brubeee/ag-supervisor.git&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ag-supervisor&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 2. Install dependencies&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;playwright&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;chromium&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 3. Launch UI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run_supervisor.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would love to hear how other developers are tackling turn synchronization, visual QA, and multi-agent loops in their own workflows! Drop any questions or ideas in the comments below.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
