<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Migration on Start AI Tools - Presented by Intent Solutions</title><link>https://startaitools.com/tags/migration/</link><description>Recent content in Migration on Start AI Tools - Presented by Intent Solutions</description><generator>Hugo</generator><language>en-US</language><copyright>Intent Solutions. All rights reserved.</copyright><lastBuildDate>Thu, 09 Apr 2026 23:29:08 -0500</lastBuildDate><atom:link href="https://startaitools.com/tags/migration/index.xml" rel="self" type="application/rss+xml"/><item><title>git-with-intent Vitest 4 Migration Pain and IRSB Governance with 104 Moloch Tests</title><link>https://startaitools.com/posts/gwi-vitest4-migration-pain-irsb-governance-moloch-tests/</link><pubDate>Thu, 12 Feb 2026 10:00:00 -0600</pubDate><guid>https://startaitools.com/posts/gwi-vitest4-migration-pain-irsb-governance-moloch-tests/</guid><description>&lt;p&gt;Eighteen commits across three repos. git-with-intent fought through a Vitest 4 migration that broke CI seven different ways. IRSB shipped v1.4.0 with governance contracts and a 104-test Moloch DAO suite. Perception got a dashboard fix.&lt;/p&gt;
&lt;h2 id="git-with-intent-vitest-4-migration"&gt;git-with-intent: Vitest 4 Migration&lt;/h2&gt;
&lt;p&gt;The v0.8.0 prep for git-with-intent included upgrading from Vitest 3.x to Vitest 4. The test suite passed locally. CI failed. Then it failed six more times in six different ways.&lt;/p&gt;
&lt;h3 id="mock-pattern-changes"&gt;Mock Pattern Changes&lt;/h3&gt;
&lt;p&gt;Vitest 4 changed how &lt;code&gt;vi.mock()&lt;/code&gt; interacts with module resolution. In Vitest 3, mock declarations were hoisted above imports automatically. Vitest 4 introduced &lt;code&gt;vi.hoisted()&lt;/code&gt; as an explicit mechanism and stopped auto-hoisting in several edge cases.&lt;/p&gt;</description></item><item><title>HustleStats Firebase Auth Cutover: 7 Dashboard Pages, 3-Layer Defense, Zero Prisma</title><link>https://startaitools.com/posts/hustlestats-firebase-auth-cutover-seven-pages/</link><pubDate>Sat, 15 Nov 2025 10:00:00 -0600</pubDate><guid>https://startaitools.com/posts/hustlestats-firebase-auth-cutover-seven-pages/</guid><description>&lt;p&gt;The Firebase migration (Days 2-7) gave HustleStats a new auth system and data layer. Today was the cutover — making every dashboard page actually use it.&lt;/p&gt;
&lt;h2 id="phase-1-planning-and-staging"&gt;Phase 1: Planning and Staging&lt;/h2&gt;
&lt;p&gt;Before touching code, I mapped every page that imported NextAuth or Prisma:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dashboard home&lt;/li&gt;
&lt;li&gt;Player list + detail&lt;/li&gt;
&lt;li&gt;Game entry + detail&lt;/li&gt;
&lt;li&gt;Stats overview&lt;/li&gt;
&lt;li&gt;Settings/profile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seven pages total. Each one imported &lt;code&gt;getServerSession&lt;/code&gt; from NextAuth and made Prisma queries for data. Every page needed both the auth and data layer swapped.&lt;/p&gt;</description></item><item><title>HustleStats Firebase Migration Days 2-7: Schema, Auth Swap, Data Port, and the Cost Cliff</title><link>https://startaitools.com/posts/hustlestats-firebase-migration-days-two-through-seven/</link><pubDate>Tue, 11 Nov 2025 10:00:00 -0600</pubDate><guid>https://startaitools.com/posts/hustlestats-firebase-migration-days-two-through-seven/</guid><description>&lt;p&gt;Six days. Four commits. The entire HustleStats backend moved from PostgreSQL + NextAuth to Firebase.&lt;/p&gt;
&lt;h2 id="day-2-firestore-schema"&gt;Day 2: Firestore Schema&lt;/h2&gt;
&lt;p&gt;The Firestore subcollection hierarchy follows the access pattern:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;users/{uid}
 └── players/{pid}
 └── games/{gid}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Every query starts with a user. Players belong to a user. Games belong to a player. The hierarchy means security rules can enforce ownership at every level without extra lookups. A read to &lt;code&gt;users/abc/players/xyz/games/123&lt;/code&gt; already proves the caller owns the path.&lt;/p&gt;</description></item></channel></rss>