<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Data Migration on Wojciech Marusiak IT Blog</title>
        <link>https://www.wojcieh.net/tags/data-migration/</link>
        <description>Recent content in Data Migration on Wojciech Marusiak IT Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Thu, 03 Sep 2026 14:00:00 +0200</lastBuildDate><atom:link href="https://www.wojcieh.net/tags/data-migration/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Migrating Antigravity Agent Sessions Across Google Account Logins</title>
        <link>https://www.wojcieh.net/migrating-antigravity-sessions-across-account-logins/</link>
        <pubDate>Thu, 03 Sep 2026 14:00:00 +0200</pubDate>
        
        <guid>https://www.wojcieh.net/migrating-antigravity-sessions-across-account-logins/</guid>
        <category>Antigravity</category>
        <category>Gemini Enterprise</category>
        <category>Google Cloud</category>
        <category>Data Migration</category>
        <category>LLMs</category>
        <category>AI &amp; LLM Ops</category>
        <category>Google Cloud</category>
        <description>&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/09/gemini-account-migration.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Migrating Antigravity Agent Sessions Across Google Account Logins&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;When you use an autonomous AI pair programmer like &lt;strong&gt;Antigravity&lt;/strong&gt; on a daily basis, your conversation sessions quickly become your primary engineering journal. Over several months, my local instance accumulated 23 deep conversations across 10 distinct projects—spanning everything from a 5,800-turn Homelab Docker deployment to complex vLLM cluster setups on Google Cloud and day-to-day scripting.&lt;/p&gt;
&lt;p&gt;Originally, my Antigravity instance was authenticated with my personal Google account (with an AI Ultra license). When I needed to switch Antigravity to log into a dedicated corporate &lt;strong&gt;Google Cloud Project&lt;/strong&gt; under the &lt;strong&gt;Gemini Enterprise&lt;/strong&gt; umbrella, I hit an unexpected wall: &lt;strong&gt;all historical Antigravity sessions were locked to the previous login identity&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-technical-root-cause-thought-signatures-and-the-http-400-error&#34;&gt;The Technical Root Cause: Thought Signatures and the HTTP 400 Error
&lt;/h2&gt;&lt;p&gt;When you try to resume an existing Antigravity session under a new account login, the failure is immediate. The agent initializes, reads the prompt, and crashes within a second with a fatal backend error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INVALID_ARGUMENT (code 400): Invalid thought signature. HTTP 400 Bad Request
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To understand why this happens, you have to look at how modern Gemini reasoning models handle agentic tool use under the hood:&lt;/p&gt;
&lt;h3 id=&#34;1-the-role-of-thought-signatures-thought_signature&#34;&gt;1. The Role of Thought Signatures (&lt;code&gt;thought_signature&lt;/code&gt;)
&lt;/h3&gt;&lt;p&gt;In autonomous coding environments like Antigravity, the model constantly plans and invokes tools (terminal execution, file viewing, code edits). When a thinking model decides to trigger a tool, it pauses its internal chain of thought.&lt;/p&gt;
&lt;p&gt;As documented in &lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling&#34;  title=&#34;Google Cloud: Function Calling and Thought Signatures&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Cloud Vertex AI Function Calling&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://ai.google.dev/gemini-api/docs/thinking&#34;  title=&#34;Google AI: Thinking Process and Reasoning State&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google AI Thinking Documentation&lt;/a&gt;, the model generates an encrypted cryptographic token called a &lt;strong&gt;&lt;code&gt;thought_signature&lt;/code&gt;&lt;/strong&gt; and attaches it directly to the &lt;code&gt;functionCall&lt;/code&gt; block. This signature acts as an encrypted save-state: it encapsulates the exact reasoning context and justification that led to the function invocation.&lt;/p&gt;
&lt;h3 id=&#34;2-mandatory-echoing-and-server-side-validation&#34;&gt;2. Mandatory Echoing and Server-Side Validation
&lt;/h3&gt;&lt;p&gt;When Antigravity executes the tool locally and sends the result (&lt;code&gt;functionResponse&lt;/code&gt;) back to Google&amp;rsquo;s backend, the API strictly enforces that the entire preceding turn—including the exact, unaltered &lt;code&gt;thought_signature&lt;/code&gt;—is echoed back.&lt;/p&gt;
&lt;p&gt;If the signature is missing, modified, or signed under a different context, the model&amp;rsquo;s backend rejects the payload immediately with &lt;code&gt;INVALID_ARGUMENT (code 400)&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;3-the-account-and-boundary-mismatch&#34;&gt;3. The Account and Boundary Mismatch
&lt;/h3&gt;&lt;p&gt;Here is the catch: &lt;strong&gt;thought signatures are cryptographically bound to the active authentication session and tenant environment&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the original setup, our conversations were created under the initial personal/Workspace account login. Every tool call in the 23 projects was signed by that account&amp;rsquo;s endpoint session keys.&lt;/li&gt;
&lt;li&gt;When we switched Antigravity to log into the corporate &lt;strong&gt;Google Cloud Project&lt;/strong&gt;, the agent sent the existing chat history (containing the old signatures) to the enterprise endpoint.&lt;/li&gt;
&lt;li&gt;The enterprise API refused to validate cryptographic reasoning states generated by an external, non-enterprise account.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-enterprise-compliance-and-tenant-isolation&#34;&gt;4. Enterprise Compliance and Tenant Isolation
&lt;/h3&gt;&lt;p&gt;This strict rejection is an intentional security mechanism rather than a bug. Under &lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/gemini/docs/discover/data-governance&#34;  title=&#34;Google Cloud: Gemini Enterprise Data Governance and Security&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Cloud&amp;rsquo;s Gemini Data Governance&lt;/a&gt;, Gemini Enterprise enforces strict tenant boundaries, zero model training on customer data, and independent encryption keys (including Customer-Managed Encryption Keys / CMEK and VPC Service Controls).&lt;/p&gt;
&lt;p&gt;Allowing unverified reasoning states from an external account to be injected into an enterprise compliance perimeter violates enterprise isolation guarantees. Once you switch your account login, existing live sessions cannot cross that cryptographic boundary.&lt;/p&gt;
&lt;h2 id=&#34;why-simply-copying-folders-fails&#34;&gt;Why Simply Copying Folders Fails
&lt;/h2&gt;&lt;p&gt;The obvious workaround is trying to copy or rename the local &lt;code&gt;brain/&lt;/code&gt; directory:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While local files (&lt;code&gt;transcript.jsonl&lt;/code&gt;, artifacts, task graphs) reside on your disk under &lt;code&gt;~/.gemini/antigravity/brain/&amp;lt;id&amp;gt;/&lt;/code&gt;, the backend session state does not belong to the new account.&lt;/li&gt;
&lt;li&gt;Duplicating or moving folders does nothing to re-sign historical &lt;code&gt;thought_signature&lt;/code&gt; tokens. When the agent attempts the next turn, the API still rejects the legacy payload.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We did not need to keep struggling with broken session handles. We needed our active configurations, verified commands, and project status operational under the new login.&lt;/p&gt;
&lt;h2 id=&#34;the-solution-extraction-distillation-and-context-seeding&#34;&gt;The Solution: Extraction, Distillation, and Context Seeding
&lt;/h2&gt;&lt;p&gt;Instead of trying to force incompatible sessions across enterprise boundaries, I built a dedicated migration pipeline (&lt;code&gt;extractor_engine.py&lt;/code&gt;) to systematically extract, clean, and re-seed our engineering state.&lt;/p&gt;
&lt;p&gt;Here is the four-step workflow that migrated all 23 conversations across our 10 projects without losing a single piece of context.&lt;/p&gt;
&lt;h3 id=&#34;1-parsing-local-trajectories-directly-from-disk&#34;&gt;1. Parsing Local Trajectories Directly from Disk
&lt;/h3&gt;&lt;p&gt;Because Antigravity logs every user prompt, model plan, and tool invocation into structured JSON Lines (&lt;code&gt;transcript.jsonl&lt;/code&gt;), we can parse the exact trajectory programmatically without touching any web UI.&lt;/p&gt;
&lt;p&gt;We wrote a Python script to scan all conversation directories in &lt;code&gt;~/.gemini/antigravity/brain/&lt;/code&gt;, extract the user requests, and map them to their parent projects:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;clean_user_content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extract clean user prompts, stripping internal XML tags.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;USER_REQUEST&amp;gt;(.*?)&amp;lt;/USER_REQUEST&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DOTALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sub&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;[^&amp;gt;]+&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_transcript&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transcript_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extract ordered user steps and agent actions from transcript.jsonl.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;turns&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transcript_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;entry_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;USER_INPUT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clean_user_content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;turns&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;elif&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;PLANNER_RESPONSE&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;turns&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;assistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;turns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-distilling-the-golden-state&#34;&gt;2. Distilling the &amp;ldquo;Golden State&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Copying 5,800 turns of raw conversation into a new enterprise session would be a terrible idea. It wastes context window tokens, inflates costs, and confuses the model with outdated debugging dead-ends and resolved bugs.&lt;/p&gt;
&lt;p&gt;Our extraction engine filtered the conversations into two distinct tiers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Full Transcripts (&lt;code&gt;&amp;lt;Project&amp;gt;_full.md&lt;/code&gt;):&lt;/strong&gt; A complete chronological archive of every prompt and response, preserved for auditability and reference.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Executive Summaries (&lt;code&gt;&amp;lt;Project&amp;gt;_summary.md&lt;/code&gt;):&lt;/strong&gt; A concise breakdown extracting only the resolved architecture:
&lt;ul&gt;
&lt;li&gt;Primary goals and requirements&lt;/li&gt;
&lt;li&gt;Generated artifacts and configuration files (&lt;code&gt;docker-compose.yaml&lt;/code&gt;, scripts, systemd units)&lt;/li&gt;
&lt;li&gt;Final operational state (IP addresses, open ports, reverse proxy rules)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;3-integrating-with-a-central-knowledge-base-obsidian&#34;&gt;3. Integrating with a Central Knowledge Base (Obsidian)
&lt;/h3&gt;&lt;p&gt;The distilled summaries were exported directly into our local &lt;strong&gt;Obsidian vault&lt;/strong&gt; (&lt;code&gt;wojcieh_vault&lt;/code&gt;), creating a permanent, searchable layer of engineering memory.&lt;/p&gt;
&lt;p&gt;By externalizing the knowledge into versioned Markdown files, the project context ceased to be an ephemeral chat log locked inside an AI tool. It became durable engineering documentation that lives independently of any specific AI model or billing account.&lt;/p&gt;
&lt;h3 id=&#34;4-generating-context-seeds-for-gemini-enterprise&#34;&gt;4. Generating Context Seeds for Gemini Enterprise
&lt;/h3&gt;&lt;p&gt;To make the transition seamless, the migration engine automatically generated a standardized &lt;strong&gt;Context Seed&lt;/strong&gt; block at the end of each summary:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Context Seed (Prompt for new Gemini Enterprise session)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Continue the project &amp;#39;Homelab&amp;#39;, task: &amp;#39;Docker Infrastructure&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Previous Session ID: 5eee075d-86e8-4006-9942-2d3d169c2d4d
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Total Historical Turns: 5,817
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Active Stack: Traefik double-proxy, Pangolin tunnel, SOPS with Age
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Host IP: 192.168.250.2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Documentation: &lt;span class=&#34;sb&#34;&gt;`02 Infrastructure/Homelab/Docker_summary.md`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Adopt this context and confirm readiness to proceed.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When opening a brand new Antigravity session under the Google Cloud Project with Gemini Enterprise, pasting this 8-line snippet brings the assistant up to speed in under 10 seconds. The model receives 100% accurate context of where the infrastructure stands, without any token bloat or subscription conflicts.&lt;/p&gt;
&lt;h2 id=&#34;key-takeaways&#34;&gt;Key Takeaways
&lt;/h2&gt;&lt;p&gt;Migrating your agentic pair programmer to a corporate Google Cloud environment brings major benefits—compliance guarantees, enterprise quotas, and centralized project billing. However, account identity boundaries mean your historical conversations cannot simply be re-linked.&lt;/p&gt;
&lt;p&gt;If you are planning a similar migration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not rely on live session resumption:&lt;/strong&gt; Antigravity sessions are tied to the account authentication context under which they were created.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage local state:&lt;/strong&gt; The biggest strength of a tool like Antigravity is that its brain state lives locally on your disk. You own the logs (&lt;code&gt;transcript.jsonl&lt;/code&gt;), which makes custom extraction straightforward.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distill before re-seeding:&lt;/strong&gt; Never dump raw historical transcripts into a new LLM session. Filter for the golden state, document it in Markdown (Obsidian/Git), and seed your new enterprise sessions with concise architectural briefs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treat your AI chat sessions as disposable working scratchpads. When you externalize decisions and configurations into version-controlled Markdown, switching account logins or AI providers becomes a routine maintenance task rather than a data loss event.&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
