<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>508.dev Blog</title><link>https://blog-old.508.dev/</link><description>508.dev Blog</description><generator>Hugo 0.146.0 &amp; FixIt v0.3.20</generator><language>en</language><managingEditor>caleb@508.dev (508.dev LLC)</managingEditor><webMaster>caleb@508.dev (508.dev LLC)</webMaster><lastBuildDate>Fri, 23 Oct 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog-old.508.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Ship mobile apps faster using Rails</title><link>https://blog-old.508.dev/posts/hotwire-native-coscup/</link><pubDate>Fri, 23 Oct 2026 10:00:00 +0800</pubDate><author>nebiyu@508.dev (Neba)</author><guid>https://blog-old.508.dev/posts/hotwire-native-coscup/</guid><category domain="https://blog-old.508.dev/categories/technical/">Technical</category><category domain="https://blog-old.508.dev/categories/programming/">Programming</category><description>&lt;p>Most teams with a Rails app eventually ask the same question: how do we get onto our users&amp;rsquo; home screens without doubling, or tripling, our engineering effort?&lt;/p>
&lt;p>I explored one answer at &lt;a href="https://coscup.org/"target="_blank" rel="external nofollow noopener noreferrer">COSCUP&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> (Conference for Open Source Coders, Users, and Promoters) in August. Speaking in the Ruby Taiwan track, I shared a topic close to my heart: &lt;strong>Building Native Mobile Apps Using Rails&lt;/strong> with &lt;a href="https://native.hotwired.dev/"target="_blank" rel="external nofollow noopener noreferrer">Hotwire Native&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> and &lt;a href="https://strada.hotwired.dev/"target="_blank" rel="external nofollow noopener noreferrer">Strada&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>. This article walks through the three routes most teams consider, what each actually costs in codebases and maintenance, and why Hotwire Native is the pragmatic option for Rails teams.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/GGojT82JL-k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video">&lt;/iframe>
 &lt;/div>

&lt;p>Would you believe me if I told you that Ruby on Rails (Rails) could also be used to build native mobile apps? You read that right: you can turn an existing Rails web application into a functional mobile app. If you have built with Rails and are looking to expand into mobile, this article is for you.&lt;/p>
&lt;p>Most internet traffic now comes from mobile devices, and users are accustomed to launching products from their home screen. Whatever platform you choose, you cannot ignore mobile.&lt;/p>
&lt;h2 class="heading-element" id="the-dilemma-of-mobile-development">&lt;span>The Dilemma of Mobile Development&lt;/span>
 &lt;a href="#the-dilemma-of-mobile-development" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Once you have decided you need a mobile app, there are three routes most teams consider. Each one trades effort in a different place.&lt;/p>
&lt;h3 class="heading-element" id="1-the-progressive-web-app-pwa-route">&lt;span>1. The Progressive Web App (PWA) Route&lt;/span>
 &lt;a href="#1-the-progressive-web-app-pwa-route" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>This is the easiest path from an existing web app: add a manifest file, and whenever users visit your app in their browser they can install it to their home screen.&lt;/p>
&lt;p>The trade-off is discoverability. Your app is not listed on the App Store or Play Store, which is the biggest drawback. Push notification support is also limited on iOS.&lt;/p>
&lt;h3 class="heading-element" id="2-the-pure-native-route-swiftswiftui--kotlinjetpack-compose">&lt;span>2. The Pure Native Route (Swift/SwiftUI + Kotlin/Jetpack Compose)&lt;/span>
 &lt;a href="#2-the-pure-native-route-swiftswiftui--kotlinjetpack-compose" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Going fully native delivers the gold standard for performance, animation, and platform integration. But it means maintaining three separate codebases: your backend/web application, an iOS app, and an Android app.&lt;/p>
&lt;p>Even with AI assistance this is cumbersome. You still split your attention across disparate languages, ecosystems, and toolchains, and every validation rule, business logic change, and UI tweak has to be implemented three times.&lt;/p>
&lt;h3 class="heading-element" id="3-cross-platform-route-react-native-flutter">&lt;span>3. Cross-Platform Route (React Native, Flutter)&lt;/span>
 &lt;a href="#3-cross-platform-route-react-native-flutter" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Cross-platform frameworks solve the duplication between iOS and Android, which is a step forward. But they still duplicate everything with your web backend.&lt;/p>
&lt;p>You still need to build and maintain an API surface, re-implement state management, duplicate validation logic on both client and server, handle token refresh lifecycles, and rebuild entire screens from scratch. Keeping web and mobile at feature parity remains an ongoing coordination tax.&lt;/p>
&lt;h3 class="heading-element" id="comparing-the-three-routes">&lt;span>Comparing the three routes&lt;/span>
 &lt;a href="#comparing-the-three-routes" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>PWA&lt;/th>
 &lt;th>Pure Native (Swift/Kotlin)&lt;/th>
 &lt;th>Cross-Platform (React Native/Flutter)&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Codebases to maintain&lt;/strong>&lt;/td>
 &lt;td>1 (your web app)&lt;/td>
 &lt;td>3 (web + iOS + Android)&lt;/td>
 &lt;td>2 (web + mobile)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>App Store / Play Store&lt;/strong>&lt;/td>
 &lt;td>Not listed&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Performance &amp;amp; animation&lt;/strong>&lt;/td>
 &lt;td>Good for content, limited for heavy UI&lt;/td>
 &lt;td>Gold standard&lt;/td>
 &lt;td>Near-native, some overhead&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Platform integration&lt;/strong>&lt;/td>
 &lt;td>Limited (especially iOS)&lt;/td>
 &lt;td>Full access&lt;/td>
 &lt;td>Good, via native modules&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Push notifications&lt;/strong>&lt;/td>
 &lt;td>Limited on iOS&lt;/td>
 &lt;td>Full&lt;/td>
 &lt;td>Full&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Offline support&lt;/strong>&lt;/td>
 &lt;td>Service workers&lt;/td>
 &lt;td>Full control&lt;/td>
 &lt;td>Full control&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Time to first release&lt;/strong>&lt;/td>
 &lt;td>Fastest&lt;/td>
 &lt;td>Slowest&lt;/td>
 &lt;td>Moderate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Ongoing maintenance&lt;/strong>&lt;/td>
 &lt;td>Lowest&lt;/td>
 &lt;td>Highest&lt;/td>
 &lt;td>Moderate to high&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Feature parity with web&lt;/strong>&lt;/td>
 &lt;td>Automatic&lt;/td>
 &lt;td>Manual, per platform&lt;/td>
 &lt;td>Manual, plus API work&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Best fit&lt;/strong>&lt;/td>
 &lt;td>Content sites, simple utilities&lt;/td>
 &lt;td>Graphics-heavy, offline-first, deeply integrated apps&lt;/td>
 &lt;td>Teams that need one mobile codebase but accept an API layer&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 class="heading-element" id="enter-hotwire-native-the-best-of-both-worlds">&lt;span>Enter Hotwire Native: The Best of Both Worlds&lt;/span>
 &lt;a href="#enter-hotwire-native-the-best-of-both-worlds" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>If you are a solo founder or part of a lean team, the decision has to be pragmatic. Hotwire Native is a counter-intuitive but entirely practical option. It changes the game by asking a simple question: &lt;strong>what if your mobile app were powered directly by your existing Rails server-rendered views?&lt;/strong> You reuse the HTML that already works on the web and keep most of the logic on the server, with very little duplication.&lt;/p>
&lt;p>It combines native navigation with server-rendered web content:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Native where it counts:&lt;/strong> The navigation container, navigation bar, back gestures, tab bars, drawer menus, modal sheet presentations, and screen transitions are 100% native iOS (Swift) and Android (Kotlin) components.&lt;/li>
&lt;li>&lt;strong>Web where it matters:&lt;/strong> The inner content of each screen is your standard Rails view, rendered server-side and delivered as fast HTML over the wire via Turbo.&lt;/li>
&lt;/ul>
&lt;p>When a user taps a link inside the web view, Hotwire Native intercepts the navigation event, pushes a new native view controller or fragment onto the navigation stack, and fetches the Rails page. To the user, screen transitions feel completely native: swiping back slides the screen away with hardware-accelerated platform physics.&lt;/p>
&lt;h2 class="heading-element" id="success-stories-of-hotwire-native">&lt;span>Success Stories of Hotwire Native&lt;/span>
 &lt;a href="#success-stories-of-hotwire-native" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Hotwire Native is a battle-tested approach to building mobile apps. It was built by the team at 37signals, who use it for the HEY and Basecamp mobile apps. That is your guarantee that you could also use it to build an app with over a million downloads.&lt;/p>
&lt;h3 class="heading-element" id="case-study-divoora-rider">&lt;span>Case study: Divoora Rider&lt;/span>
 &lt;a href="#case-study-divoora-rider" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>I have also personally built a greenfield project using this approach. &lt;a href="https://divoora.ch"target="_blank" rel="external nofollow noopener noreferrer">Divoora&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> is a food delivery and logistics company based in Switzerland, and they needed a mobile app for their riders. I built it on Rails with Hotwire Native and shipped it to both the &lt;a href="https://play.google.com/store/apps/details?id=com.divoora.rider&amp;amp;pcampaignid=web_share"target="_blank" rel="external nofollow noopener noreferrer">Play Store&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> and the &lt;a href="https://apps.apple.com/ch/app/divoora-rider/id6736853007?l=en-GB"target="_blank" rel="external nofollow noopener noreferrer">App Store&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>.&lt;/p>
&lt;p>What made it fast:&lt;/p>
&lt;ul>
&lt;li>The rider-facing screens were standard Rails views, so web and mobile shared one codebase and one set of validations.&lt;/li>
&lt;li>Native navigation, tab bars, and gestures came from the Hotwire Native wrappers rather than custom mobile UI work.&lt;/li>
&lt;li>Fixes and feature changes shipped from the Rails server without waiting on App Store review.&lt;/li>
&lt;/ul>
&lt;p>I am also currently building an app for book clubs using Hotwire Native. I started with the Rails backend, and after onboarding the first book club I began the iOS and Android apps. It is currently in testing on the Play Store.&lt;/p>
&lt;p>I hope by now I have convinced you that Hotwire Native can be used to build successful production mobile apps.&lt;/p>
&lt;h2 class="heading-element" id="why-this-matters-for-velocity">&lt;span>Why This Matters for Velocity&lt;/span>
 &lt;a href="#why-this-matters-for-velocity" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>In practice, the operational benefits of Hotwire Native are massive:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Instant Updates &amp;amp; Zero App Review Friction:&lt;/strong> When you fix a typo, update business logic, or launch a new feature in a Rails controller or template, you deploy it to your web server and it is live in your mobile apps instantly. You only need to submit an App Store update when you modify native Swift/Kotlin wrapper code or add new native bridge components.&lt;/li>
&lt;li>&lt;strong>Single Source of Truth:&lt;/strong> Your routes, models, authorization policies, and validations exist in one place. No drifting REST or GraphQL API contracts.&lt;/li>
&lt;li>&lt;strong>Hyper-Lean Team Size:&lt;/strong> A single developer or a two-person team can comfortably build, ship, and maintain desktop web, mobile web, iOS, and Android applications simultaneously without burning out.&lt;/li>
&lt;/ol>
&lt;h2 class="heading-element" id="reflections-from-coscup-and-qa">&lt;span>Reflections from COSCUP and Q&amp;amp;A&lt;/span>
 &lt;a href="#reflections-from-coscup-and-qa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Presenting at COSCUP was a fantastic experience. The Ruby Taiwan community is vibrant, welcoming, and deeply interested in practical engineering solutions that increase developer happiness and efficiency.&lt;/p>
&lt;p>During the Q&amp;amp;A and hallway discussions, several great questions came up:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>What about offline support?&lt;/strong> Hotwire Native caches screenshots for back navigation. Offline workflows require explicit web or native storage and synchronization; bridge components can connect that storage to the web UI.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>When is Hotwire Native NOT the right tool?&lt;/strong> If you are building a graphic-intensive game, a video editor with frame-by-frame canvas manipulation, or an app whose core value is 100% offline-first utility, pure native or specialized engines are better fits. But for 90% of business applications, SaaS dashboards, e-commerce, and community platforms, Hotwire Native is more than sufficient; it is superior in iteration speed.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 class="heading-element" id="slides-and-resources">&lt;span>Slides and Resources&lt;/span>
 &lt;a href="#slides-and-resources" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>If you would like to explore the slides or dive into the code from my talk:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Slides:&lt;/strong> &lt;a href="https://nebiyuelias1.github.io/coscup-2026-talk/"target="_blank" rel="external nofollow noopener noreferrer">Building Native Mobile Apps Using Rails&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;strong>COSCUP Session Details:&lt;/strong> &lt;a href="https://coscup.org/2026/track/516?session=BKCVJK"target="_blank" rel="external nofollow noopener noreferrer">Ruby Taiwan Track @ COSCUP&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;strong>Official Documentation:&lt;/strong> &lt;a href="https://native.hotwired.dev/"target="_blank" rel="external nofollow noopener noreferrer">Hotwire Native&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> &amp;amp; &lt;a href="https://strada.hotwired.dev/"target="_blank" rel="external nofollow noopener noreferrer">Strada&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 class="heading-element" id="work-with-508dev">&lt;span>Work with 508.dev&lt;/span>
 &lt;a href="#work-with-508dev" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;a href="https://508.dev"target="_blank" rel="external nofollow noopener noreferrer">508.dev&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> is a worker-owned software co-op that helps small teams ship web and mobile products. If you are weighing a mobile app for your Rails product, here is how to start:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://cal.com/nebiyuelias1/508.dev"target="_blank" rel="external nofollow noopener noreferrer">Book a free 30-minute assessment&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>:&lt;/strong> Walk us through your app and we will tell you honestly whether Hotwire Native fits, what should stay native, and what it would take to ship.&lt;/li>
&lt;li>&lt;strong>Rails to App Store checklist:&lt;/strong> Email &lt;a href="mailto:nebiyu@508.dev"target="_blank" rel="external nofollow noopener noreferrer">nebiyu@508.dev&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> and we will send the checklist we use to take a Rails app from local development to both stores.&lt;/li>
&lt;li>&lt;strong>Build with us:&lt;/strong> Learn more at &lt;a href="https://508.dev"target="_blank" rel="external nofollow noopener noreferrer">508.dev&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>.&lt;/li>
&lt;/ul></description></item><item><title>Why I Switched to Paseo to Orchestrate Coding Agents</title><link>https://blog-old.508.dev/posts/paseo-visual-agent-orchestration/</link><pubDate>Sat, 25 Jul 2026 00:00:00 +0900</pubDate><author>michael@508.dev (Michael Wu)</author><guid>https://blog-old.508.dev/posts/paseo-visual-agent-orchestration/</guid><category domain="https://blog-old.508.dev/categories/technical/">Technical</category><description>&lt;p>If you are looking for an agentic development environment (ADE), I would check out &lt;a href="https://paseo.sh/"target="_blank" rel="external nofollow noopener noreferrer">Paseo&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>.&lt;/p>
&lt;p>There has been an explosion of tools in this category. I have been looking at a small mix of GUI-based and terminal-first options. This is not a feature matrix or a ranking—just the short list I considered and the details that stood out to me while I was deciding what to use.&lt;/p>
&lt;h2 class="heading-element" id="other-tools-i-looked-at">&lt;span>Other Tools I Looked At&lt;/span>
 &lt;a href="#other-tools-i-looked-at" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="gui-based">&lt;span>GUI-Based&lt;/span>
 &lt;a href="#gui-based" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://www.agentastic.dev/"target="_blank" rel="external nofollow noopener noreferrer">Agentastic&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>: not open source yet.&lt;/li>
&lt;li>&lt;a href="https://agentsroom.dev/"target="_blank" rel="external nofollow noopener noreferrer">Agents Room&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>: supports remote use, but is not open source.&lt;/li>
&lt;li>&lt;a href="https://www.conductor.build/"target="_blank" rel="external nofollow noopener noreferrer">Conductor&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>: what I was using previously.&lt;/li>
&lt;li>&lt;a href="https://www.onorca.dev/"target="_blank" rel="external nofollow noopener noreferrer">Orca&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>: supports remote use, is open source, and has a mobile app.&lt;/li>
&lt;li>&lt;a href="https://emdash.ai/"target="_blank" rel="external nofollow noopener noreferrer">Emdash&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>: open source and appears to support remote use.&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="terminal-first">&lt;span>Terminal-First&lt;/span>
 &lt;a href="#terminal-first" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://cmux.com/"target="_blank" rel="external nofollow noopener noreferrer">cmux&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://herdr.dev/"target="_blank" rel="external nofollow noopener noreferrer">Herdr&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>For a broader overview, see Ryan Walker’s &lt;a href="https://rywalker.com/research/mac-coding-agent-apps"target="_blank" rel="external nofollow noopener noreferrer">comparison of Mac coding-agent apps&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>. I encourage people to try out various tools to see how they work for you!&lt;/p>
&lt;p>I had previously recommended &lt;a href="https://www.conductor.build/"target="_blank" rel="external nofollow noopener noreferrer">Conductor&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>, and I still think it has the best UI and flow for making development more automatic. It is a genuinely polished experience, and that matters when the goal is to make agent work easier to follow and manage.&lt;/p>
&lt;p>Paseo is the better fit for me right now because I am optimizing for something slightly different: control over the devices I already run, the ability to work across them, and the option to bring agent orchestration into my own command-line workflows.&lt;/p>
&lt;h2 class="heading-element" id="what-i-am-optimizing-for">&lt;span>What I Am Optimizing For&lt;/span>
 &lt;a href="#what-i-am-optimizing-for" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>This is not a claim that one tool is better at everything. Conductor’s interface and workflow are still the bar for me when I think about how this kind of environment should feel to use.&lt;/p>
&lt;p>The deciding constraint in my own setup is remote control. At the time I made this decision, Remote was available only through paid Conductor Cloud, which means I could not use it to remotely control my own devices in the way I wanted. That is a mismatch with my setup, not a dismissal of Conductor.&lt;/p>
&lt;p>For Paseo, the practical checklist is straightforward:&lt;/p>
&lt;ul>
&lt;li>It is fully open source.&lt;/li>
&lt;li>It has Linux and Windows apps.&lt;/li>
&lt;li>It has mobile apps.&lt;/li>
&lt;li>It can itself be orchestrated through a CLI.&lt;/li>
&lt;/ul>
&lt;p>Those are the things I need from an ADE more than a broad feature-by-feature comparison. The CLI point is especially important to me: I do not want the visual layer to be isolated from the rest of my workflow. I want the option to include agent orchestration itself in the way I automate and coordinate work.&lt;/p>
&lt;h2 class="heading-element" id="the-ade-i-actually-need">&lt;span>The ADE I Actually Need&lt;/span>
 &lt;a href="#the-ade-i-actually-need" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>I have Paseo instances running on both my MacBook and a mini PC at home. I can control them through my Hermes agent or the mobile app.&lt;/p>
&lt;p>To give an agent the same access, I wrote &lt;a href="https://github.com/508-dev/paseo-agent-orchestration"target="_blank" rel="external nofollow noopener noreferrer">Paseo Agent Orchestration&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>, an Agent Skills-compatible package for safely coordinating trusted coding agents through Paseo. Install its &lt;code>skills/paseo-agent-orchestration&lt;/code> directory using your client’s Agent Skills mechanism, then point the client at the Paseo daemon it will manage. Keep the endpoint and authentication details in the client’s deployment configuration, separate from an untracked, read-only repository alias map that identifies the repositories the skill may target. Those aliases identify targets, not what the skill can do; it can still use its permitted Paseo tools to create and manage work. On the same machine, that can be the local daemon the desktop app has already started; for a remote host, the client needs a secure route to the relevant daemon’s MCP endpoint. I use it with Hermes, but I intentionally kept the core skill agent-neutral, so it can also be used with OpenClaw or another compatible client.&lt;/p>
&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/images/paseo-mobile-remote-control.png' alt="Paseo mobile app showing MacBook and home mini PC remote hosts">&lt;/p>
&lt;p>That is the difference that makes Paseo practical for me. I am not choosing an ADE only by how it feels on one machine at one desk. I want it to fit the way I already split work across my MacBook and a machine at home, while still being reachable when I am away from either one.&lt;/p>
&lt;p>The visual interface still matters, of course. But in my setup, the requirement that changes the decision is being able to operate my own devices.&lt;/p>
&lt;h2 class="heading-element" id="adding-workflows-with-hub">&lt;span>Adding Workflows with Hub&lt;/span>
 &lt;a href="#adding-workflows-with-hub" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;a href="https://github.com/getpaseo/hub"target="_blank" rel="external nofollow noopener noreferrer">Paseo Hub&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> is a self-hosted automation layer for Paseo. It can start coding agents from GitHub, Slack, Discord, or a manual run, then dispatch them to the Paseo daemons on the machines you already own.&lt;/p>
&lt;p>That is an interesting extension of the setup I want: not just a visual tool I open when I sit down, but a way for work that arrives in Discord or GitHub to trigger the right workflow on the right machine. Hub keeps its triggers, environments, permissions, and prompts in version-controlled &lt;code>.paseo/hub.yml&lt;/code> and &lt;code>.paseo/workflows/&lt;/code> files.&lt;/p>
&lt;p>It is still in early development; Hub’s README warns that breaking changes and data loss are possible. I would treat it as something to experiment with rather than production infrastructure for now.&lt;/p>
&lt;h2 class="heading-element" id="why-open-source-changes-how-i-use-it">&lt;span>Why Open Source Changes How I Use It&lt;/span>
 &lt;a href="#why-open-source-changes-how-i-use-it" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>The maintainer is also serious about keeping Paseo open source. As he has described it, the plan is to keep everything open source—including the relay—while fully supporting self-hosting and offering paid hosted services for people who want that option. That combination matters to me: it keeps self-hosting as a first-class option without taking away the convenience of a hosted service.&lt;/p>
&lt;p>I am actively making improvements to Paseo and seeing whether they will get merged. These are things like support for &lt;code>.worktreeinclude&lt;/code>, importing sessions from other ADEs, and more automatic development. That is another meaningful part of the appeal for me: I can participate in improving the tool I use instead of treating it as a fixed service.&lt;/p>
&lt;p>The maintainer has been responsive in my experience. That does not guarantee that every contribution will be accepted, but it makes experimentation and upstream collaboration feel worthwhile.&lt;/p>
&lt;h2 class="heading-element" id="bottom-line">&lt;span>Bottom Line&lt;/span>
 &lt;a href="#bottom-line" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>If polished UI and flow are your first priority, I still think &lt;a href="https://www.conductor.build/"target="_blank" rel="external nofollow noopener noreferrer">Conductor&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> is worth a close look. It remains my reference point for making development feel more automatic.&lt;/p>
&lt;p>If you share my priorities—an ADE for coordinating coding agents across your own devices, access through Hermes or a mobile app, an open source project, and orchestration that can fit into CLI-based workflows—&lt;a href="https://paseo.sh/"target="_blank" rel="external nofollow noopener noreferrer">Paseo&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> is worth trying.&lt;/p>
&lt;p>For me, it is not about declaring a universal winner. It is about choosing the ADE that fits the way I actually work.&lt;/p></description></item><item><title>How to Use clawpatch to Fix Your Vibecoded AI Slop</title><link>https://blog-old.508.dev/posts/how-to-use-clawpatch-to-fix-your-vibecoded-ai-slop/</link><pubDate>Fri, 12 Jun 2026 11:43:00 +0200</pubDate><guid>https://blog-old.508.dev/posts/how-to-use-clawpatch-to-fix-your-vibecoded-ai-slop/</guid><category domain="https://blog-old.508.dev/categories/technical/">Technical</category><category domain="https://blog-old.508.dev/categories/programming/">Programming</category><description>&lt;p>So, you have been vibecoding.&lt;/p>
&lt;p>You managed to create a useful, maybe even awesome, tool. But now you have realised something slightly uncomfortable: the thing has become a bit of a monster.&lt;/p>
&lt;p>The repo works, sure. But it is also full of code debt, strange decisions, duplicated logic, and the kind of “I’ll clean this up later” code that somehow never gets cleaned up later.&lt;/p>
&lt;p>So what can you do now?&lt;/p>
&lt;p>You could go through the whole codebase yourself. You could also ask an agent directly to clean things up, which can be fine for smaller fixes.&lt;/p>
&lt;p>But for this kind of repo cleanup, I like using &lt;strong>&lt;a href="https://clawpatch.ai/"target="_blank" rel="external nofollow noopener noreferrer">clawpatch&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/strong>. It gives me the loop I want for this kind of thing: map the repo, review it in &lt;code>deslopify&lt;/code> mode, fix one finding, review the diff, revalidate, and repeat.&lt;/p>
&lt;p>So instead of making my own workflow with prompts or custom skills, I can just use something that is already built around cleaning up a messy codebase.&lt;/p>
&lt;p>It also helps that clawpatch comes from the &lt;a href="https://github.com/openclaw/openclaw"target="_blank" rel="external nofollow noopener noreferrer">OpenClaw&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> world and is made by &lt;a href="https://github.com/steipete"target="_blank" rel="external nofollow noopener noreferrer">Peter Steinberger&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>. That gives it a bit more weight for me, since it comes from someone already deep in this kind of AI coding workflow.&lt;/p>
&lt;p>Here is a short guide on how to use it.&lt;/p>
&lt;h2 class="heading-element" id="install-clawpatch">&lt;span>Install clawpatch&lt;/span>
 &lt;a href="#install-clawpatch" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Start by installing clawpatch globally:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install -g clawpatch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 class="heading-element" id="initialise-your-project">&lt;span>Initialise Your Project&lt;/span>
 &lt;a href="#initialise-your-project" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Next, initialise your project with clawpatch:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch init&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 class="heading-element" id="build-a-semantic-map">&lt;span>Build a Semantic Map&lt;/span>
 &lt;a href="#build-a-semantic-map" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Then build a semantic map of your codebase:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch map&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This gives clawpatch a better understanding of how your project is structured and how the different parts of the code relate to each other.&lt;/p>
&lt;h2 class="heading-element" id="run-your-first-review">&lt;span>Run Your First Review&lt;/span>
 &lt;a href="#run-your-first-review" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Now you can run a review. Since this post is about cleaning up vibecoded code, start with &lt;code>deslopify&lt;/code> mode:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch review --mode deslopify --limit &lt;span class="m">3&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The &lt;code>--limit 3&lt;/code> part keeps the first run small and manageable. You can increase it later when you feel more comfortable with the workflow.&lt;/p>
&lt;p>&lt;code>deslopify&lt;/code> means that clawpatch focuses on cleanup findings that can be justified from the local codebase. Instead of broad opinions, it looks for concrete cleanup work.&lt;/p>
&lt;p>If you want a broader review later, you can run:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch review --limit &lt;span class="m">3&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>You can find the raw findings here:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">.clawpatch/findings/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>clawpatch should also generate a report that is easier to read. The report is basically a human-readable summary of the findings.&lt;/p>
&lt;p>If the report was not generated automatically, you can generate it manually:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch report&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The reports can be found here:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">.clawpatch/reports/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 class="heading-element" id="pick-a-finding-to-fix">&lt;span>Pick a Finding to Fix&lt;/span>
 &lt;a href="#pick-a-finding-to-fix" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>To fix a finding, you need to look for its ID.&lt;/p>
&lt;p>You can find this in the report as the &lt;code>id&lt;/code> field, or in one of the &lt;code>.json&lt;/code> files inside &lt;code>.clawpatch/findings/&lt;/code> as &lt;code>findingId&lt;/code>.&lt;/p>
&lt;p>Take a read through the report and make a judgement on what you want to fix first. No need to fix everything at once. Pick one finding, copy the ID, and run:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch fix --finding &amp;lt;finding-id&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This will run the AI and let it try to fix the issue.&lt;/p>
&lt;p>Important thing to know: &lt;code>clawpatch fix&lt;/code> changes your worktree, but it does not mean the fix is automatically accepted. You still need to manually review the diff before you keep it, commit it, or continue building on top of it.&lt;/p>
&lt;p>As an example, in one of my runs, clawpatch found some buggy CSV parsing code. It fixed the code and added a test to validate the solution. Quite nice, actually.&lt;/p>
&lt;h2 class="heading-element" id="revalidate-the-finding">&lt;span>Revalidate the Finding&lt;/span>
 &lt;a href="#revalidate-the-finding" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>This is not the end of the process. After fixing a finding, you should revalidate it:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch revalidate --finding &amp;lt;finding-id&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This makes clawpatch look at the same finding again and update its status.&lt;/p>
&lt;p>So if the issue is no longer relevant after the fix, the report can reflect that. If it is still there, you know you may need to take another look.&lt;/p>
&lt;h2 class="heading-element" id="repeat-the-process">&lt;span>Repeat the Process&lt;/span>
 &lt;a href="#repeat-the-process" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>After that, you can continue finding more issues:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch review --mode deslopify --limit &amp;lt;limit-amount&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Then fix a finding:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch fix --finding &amp;lt;finding-id&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Manually review the diff, then revalidate it:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">clawpatch revalidate --finding &amp;lt;finding-id&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>That is the basic loop.&lt;/p>
&lt;p>Review, fix, manually review the diff, revalidate. Then repeat.&lt;/p>
&lt;p>This gives you a pretty straightforward way to chip away at the mess without turning it into a big refactoring project. You can read the findings, pick what looks useful, let clawpatch do the fix, review the diff, and then move on to the next thing.&lt;/p>
&lt;p>Very reasonable.&lt;/p>
&lt;h2 class="heading-element" id="further-reading">&lt;span>Further Reading&lt;/span>
 &lt;a href="#further-reading" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>For further reading, check out:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://clawpatch.ai/"target="_blank" rel="external nofollow noopener noreferrer">Official clawpatch documentation&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/openclaw/clawpatch"target="_blank" rel="external nofollow noopener noreferrer">clawpatch on GitHub&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The GitHub README also includes a more complete workflow with commands like &lt;code>clawpatch next&lt;/code>, &lt;code>clawpatch show&lt;/code>, &lt;code>clawpatch triage&lt;/code>, &lt;code>clawpatch ci&lt;/code>, and &lt;code>clawpatch open-pr&lt;/code>. That is useful if you want to go beyond this basic introduction and use clawpatch in a more structured or CI/CD-style workflow.&lt;/p></description></item><item><title>Introducing 508 Devkit</title><link>https://blog-old.508.dev/posts/508-devkit/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><author>michael@508.dev (Michael Wu)</author><guid>https://blog-old.508.dev/posts/508-devkit/</guid><category domain="https://blog-old.508.dev/categories/technical/">Technical</category><description>&lt;p>We started a new project: &lt;a href="https://github.com/508-dev/508-devkit"target="_blank" rel="external nofollow noopener noreferrer">508 Devkit&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>, a collection of opinionated project defaults for repos. It is intentionally not an application framework.&lt;/p>
&lt;p>At 508.dev, we have been working on a number of open source projects under the &lt;a href="https://github.com/508-dev/"target="_blank" rel="external nofollow noopener noreferrer">508.dev GitHub organization&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>, and one thing that keeps coming up is how much the first few hours of a repo shape everything that follows. Before there is much product code, the project has already made a lot of decisions: which package manager it expects, how local services should run, where environment files live, whether Docker is for infrastructure or the whole development loop, what CI should care about, and what instructions future contributors and agents are supposed to follow.&lt;/p>
&lt;p>If those decisions are not written down, they still happen. They just happen by accident.&lt;/p>
&lt;p>That matters more now because coding agents are part of our workflow. They are useful, but they are also happy to fill in blanks with something that looks reasonable in the moment. One agent might assume npm in a repo where we want Bun first. Another might add pnpm support in a slightly different way. A third might produce a Docker-first setup when the project is supposed to run app services on the host and use Docker Compose only for databases, queues, or caches. Each individual choice is easy to fix, but after a while the repo starts accumulating little inconsistencies that make it harder for both humans and agents to understand what &amp;ldquo;normal&amp;rdquo; looks like.&lt;/p>
&lt;p>508 Devkit is our attempt to write those defaults down before the project has a chance to drift.&lt;/p>
&lt;h2 class="heading-element" id="defaults-are-part-of-the-project">&lt;span>Defaults Are Part of the Project&lt;/span>
 &lt;a href="#defaults-are-part-of-the-project" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>This is not meant to be a universal template where every repo gets the same stack. We do not want that, and most real projects would outgrow it quickly. The goal is narrower: give a new project a clear starting shape, especially when we already know agents will be reading and modifying the codebase.&lt;/p>
&lt;p>For JavaScript, that means treating Bun and pnpm as first-class examples. For Python, it means documenting optional &lt;code>uv&lt;/code> workspace conventions instead of leaving every service to rediscover them. Across ecosystems, it means including dependency cooldowns when supported to improve security posture.&lt;/p>
&lt;p>The same idea applies to local development. We keep wanting host-run development services, Docker Compose examples for local infrastructure, deterministic ports for worktrees, &lt;code>.worktreeinclude&lt;/code> for copying local-only environment files into sibling worktrees, and a &lt;code>.dockerignore&lt;/code> that keeps Docker build contexts small and avoids sweeping secrets into images. None of these things are exciting, but they are sane defaults that set up future development.&lt;/p>
&lt;h2 class="heading-element" id="instructions-for-agents-not-just-humans">&lt;span>Instructions for Agents, Not Just Humans&lt;/span>
 &lt;a href="#instructions-for-agents-not-just-humans" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Most project setup still assumes the reader is a human with enough context to fill in gaps. That assumption is weaker now. If Codex, Claude Code, Cursor, and whatever comes next are going to work in a repo, they need instructions written for the way they actually operate.&lt;/p>
&lt;p>That means telling them where local context belongs, which files are workspace-only, which commands are preferred, how worktrees should pick ports, and what conventions should not be overwritten just because a generated patch would be simpler without them. Agent instructions do not need to be long, but they do need to be specific. &amp;ldquo;Write good code&amp;rdquo; is not useful guidance. &amp;ldquo;Use Bun first, keep &lt;code>.context/&lt;/code> gitignored, prefer host-run app services, and use Docker Compose for local infrastructure&amp;rdquo; is much harder to misinterpret.&lt;/p>
&lt;p>508 Devkit includes agent-native instructions for Codex, Claude Code, Cursor, and future agents, along with &lt;code>.context/&lt;/code> conventions for agent orchestrator workflows. The point is not to add process for its own sake; it is to give agents enough local knowledge that they stop inventing project policy from nearby files.&lt;/p>
&lt;h2 class="heading-element" id="the-boring-files-carry-a-lot-of-weight">&lt;span>The Boring Files Carry a Lot of Weight&lt;/span>
 &lt;a href="#the-boring-files-carry-a-lot-of-weight" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>The files people skip past during setup often matter more than they get credit for. A clear &lt;code>.dockerignore&lt;/code> protects build contexts from becoming enormous or accidentally secret-filled. GitHub issue, PR, and CI hygiene makes agent-generated work easier to review because reviewers can tell what kind of evidence, tests, and description the project expects.&lt;/p>
&lt;p>508 Devkit also includes examples for the stacks we commonly use. On the Python side, that includes Pydantic settings and schemas, Alembic migrations, Ruff, MyPy, and Pytest. On the TypeScript side, it includes Drizzle ORM, Biome, and Vitest. There are also optional examples for SOPS if you want to use it for secrets management.&lt;/p>
&lt;h2 class="heading-element" id="a-better-starting-point">&lt;span>A Better Starting Point&lt;/span>
 &lt;a href="#a-better-starting-point" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>The bet behind 508 Devkit is that setup is a communication layer. Humans read it, agents read it, CI reads it, and future contributors read it months later when nobody remembers why a convention exists. The more a repo can explain itself early, the less coordination it needs later.&lt;/p>
&lt;p>We expect the kit to evolve as we use it across more projects. For now, it is a collection of the defaults we keep wanting whenever we start something new: agent instructions, local context conventions, package manager examples, dependency safety, worktree ergonomics, infrastructure examples, Docker hygiene, CI hygiene, and practical backend/frontend tooling.&lt;/p>
&lt;h2 class="heading-element" id="quickstart">&lt;span>Quickstart&lt;/span>
 &lt;a href="#quickstart" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>There are two straightforward ways to use it.&lt;/p>
&lt;p>&lt;strong>Use the repo directly.&lt;/strong> Point your agent at &lt;a href="https://github.com/508-dev/508-devkit"target="_blank" rel="external nofollow noopener noreferrer">github.com/508-dev/508-devkit&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>, or at a local checkout of it, as the project bootstrap reference. Have it inspect your target repo, ask any necessary questions, and then apply the relevant conventions rather than copying everything blindly.&lt;/p>
&lt;p>&lt;strong>Or install the bundled agent skill.&lt;/strong> Install the skill from &lt;a href="https://raw.githubusercontent.com/508-dev/508-devkit/main/skills/508-devkit/SKILL.md"target="_blank" rel="external nofollow noopener noreferrer">skills/508-devkit/SKILL.md&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> in the repo, or from &lt;code>skills/508-devkit/SKILL.md&lt;/code> in a local checkout. Run it as &lt;code>/508-devkit&lt;/code>, &lt;code>/bootstrap-project&lt;/code>, or whatever command name your agent client assigns.&lt;/p>
&lt;p>Either way, treat the kit like untrusted code: read what it proposes, understand the changes, and apply only what fits your project.&lt;/p>
&lt;p>If you are starting a project where AI agents are going to be part of the development workflow, 508 Devkit is meant to give both the humans and the agents a better starting point.&lt;/p>
&lt;p>You can check it out here: &lt;a href="https://github.com/508-dev/508-devkit"target="_blank" rel="external nofollow noopener noreferrer">github.com/508-dev/508-devkit&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> 🙂&lt;/p></description></item><item><title>508.dev in Japan!</title><link>https://blog-old.508.dev/posts/japan-meetup/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0800</pubDate><author>caslinden@508.dev (Cas Linden)</author><guid>https://blog-old.508.dev/posts/japan-meetup/</guid><category domain="https://blog-old.508.dev/categories/non-technical/">Non-Technical</category><description>&lt;h3 class="heading-element" id="the-japan-side-of-508dev-is-going-strong">&lt;span>The Japan side of 508.dev is going strong!&lt;/span>
 &lt;a href="#the-japan-side-of-508dev-is-going-strong" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>To celebrate the rising number of members and contributions, we got together for some beers earlier this April.&lt;/p>
&lt;p>These happy fellows (top to bottom) Michael, Kevin, and Cas on the left. And Alfred, Masa, Robbin, and Sanath on the right, are seen here enjoying some well-earned beverages, on 508&amp;rsquo;s tab 🙏&lt;/p>
&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/japan-meet-1.jpg' alt="Japan meetup">&lt;/p>
&lt;p>We discussed life in Japan, pets, and gaming expat life to maximize perks!&lt;/p>
&lt;p>Much to my delight, I found the guys seated at a very chill &lt;a href="https://www.google.com/search?q=PDX&amp;#43;beer&amp;#43;bar&amp;#43;harajuku&amp;amp;sca_esv=81978db0d0913d93&amp;amp;sxsrf=ANbL-n40mCUxCy4Q92690Yc4-YNnj1ppfA:1776073966012&amp;amp;ei=7rzcad0wh5S-vQ_BsMzhDA&amp;amp;biw=1693&amp;amp;bih=1060&amp;amp;ved=0ahUKEwjd39qOx-qTAxUHiq8BHUEYM8wQ4dUDCBE&amp;amp;uact=5&amp;amp;oq=PDX&amp;#43;beer&amp;#43;bar&amp;#43;harajuku&amp;amp;gs_lp=Egxnd3Mtd2l6LXNlcnAiFVBEWCBiZWVyIGJhciBoYXJhanVrdTIGEAAYFhgeMggQABiABBiiBDIIEAAYgAQYogQyCBAAGIAEGKIEMggQABiABBiiBDIIEAAYgAQYogRI7RxQAFjYG3AAeAGQAQCYAccBoAGgEqoBBDguMTO4AQPIAQD4AQGYAhWgApcTwgIEECMYJ8ICBBAuGCfCAgoQLhhDGIAEGIoFwgIKEC4YgAQYigUYQ8ICChAAGIAEGIoFGEPCAhEQLhiABBiKBRiRAhjHARivAcICCxAAGIAEGIoFGJECwgIgEC4YgAQYigUYkQIYxwEYrwEYlwUY3AQY3gQY4ATYAQHCAg4QLhivARjHARiABBiOBcICBRAAGIAEwgIOEC4YgAQYxwEYrwEYjgXCAgsQLhiABBjHARivAcICBRAuGIAEwgIQEC4YgAQYigUYQxjHARivAcICHRAuGIAEGMcBGK8BGI4FGJcFGNwEGN4EGOAE2AEBwgIIEAAYFhgeGArCAgUQABjvBcICBRAhGKABwgIHECEYChigAcICBRAhGJ8FmAMAugYGCAEQARgUkgcGNS4xNS4xoAfNcrIHBjUuMTUuMbgHlxPCBwgzLjYuMTEuMcgHTIAIAQ&amp;amp;sclient=gws-wiz-serp"target="_blank" rel="external nofollow noopener noreferrer">Portland style craft beer bar&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a> across the street from the Trunk Hotel in Harajuku. The original plan to have dinner at said Hotel fell through because of some loud DJ event.&lt;/p>
&lt;p>Let&amp;rsquo;s do it again soon, devs!&lt;/p></description></item><item><title>Part 6: Auditable AI: Using Blockchain for Trust &amp; Governance</title><link>https://blog-old.508.dev/posts/part-6-what-comes-next-predictions/</link><pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog-old.508.dev/posts/part-6-what-comes-next-predictions/</guid><description>&lt;h2 class="heading-element" id="-series-navigation">&lt;span>📚 Series Navigation&lt;/span>
 &lt;a href="#-series-navigation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-1-ai-blockchain-cloud-who-does-what/">Part 1: AI, Blockchain, and Cloud: Who Actually Does What?&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-2-why-fully-decentralized-ai-is-a-myth/">Part 2: Why Fully Decentralized AI Is (Mostly) a Myth&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-3-web3-data-to-cloud-ml-pipelines/">Part 3: Web3 Data -&amp;gt; Cloud ML Pipelines (Spark in Practice)&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-4-ai-for-blockchain-fraud-anomaly-detection/">Part 4: AI for Blockchain Fraud &amp;amp; Anomaly Detection&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-5-smart-contracts-ai-agents-autonomous-systems/">Part 5: Smart Contracts + AI Agents: Autonomous Systems&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>Part 6: Auditable AI: Using Blockchain for Trust &amp;amp; Governance&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="auditable-ai-using-blockchain-for-trust--governance">&lt;span>Auditable AI: Using Blockchain for Trust &amp;amp; Governance&lt;/span>
 &lt;a href="#auditable-ai-using-blockchain-for-trust--governance" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/images/ai-web3-series/part6-audit.jpg' alt="Part 6 overview">&lt;/p>
&lt;h2 class="heading-element" id="the-trust-problem">&lt;span>The Trust Problem&lt;/span>
 &lt;a href="#the-trust-problem" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>AI systems increasingly affect:&lt;/p>
&lt;ul>
&lt;li>Finance&lt;/li>
&lt;li>Credit&lt;/li>
&lt;li>Governance&lt;/li>
&lt;li>Compliance&lt;/li>
&lt;/ul>
&lt;p>But they are often opaque, which makes audits and incident response painfully slow.&lt;/p>
&lt;h2 class="heading-element" id="blockchain-as-an-audit-log">&lt;span>Blockchain as an Audit Log&lt;/span>
 &lt;a href="#blockchain-as-an-audit-log" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Store:&lt;/p>
&lt;ul>
&lt;li>Model hash&lt;/li>
&lt;li>Input hash&lt;/li>
&lt;li>Output hash&lt;/li>
&lt;li>Timestamp&lt;/li>
&lt;li>Signer&lt;/li>
&lt;/ul>
&lt;p>These fields create a tamper-evident chain of custody for model decisions.&lt;/p>
&lt;h2 class="heading-element" id="example-record">&lt;span>Example Record&lt;/span>
 &lt;a href="#example-record" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;abc123&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;input&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;def456&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;output&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ghi789&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1700000000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 class="heading-element" id="why-this-matters">&lt;span>Why This Matters&lt;/span>
 &lt;a href="#why-this-matters" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Regulatory audits&lt;/li>
&lt;li>Post-incident analysis&lt;/li>
&lt;li>Model accountability&lt;/li>
&lt;li>Explainability&lt;/li>
&lt;/ul>
&lt;h2 class="heading-element" id="final-takeaway">&lt;span>Final Takeaway&lt;/span>
 &lt;a href="#final-takeaway" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Blockchain does not make AI smarter. It makes AI answerable and reproducible.&lt;/p>
&lt;h2 class="heading-element" id="series-summary">&lt;span>Series Summary&lt;/span>
 &lt;a href="#series-summary" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Technology&lt;/th>
 &lt;th>Role&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>AI&lt;/td>
 &lt;td>Intelligence&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Blockchain&lt;/td>
 &lt;td>Trust&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cloud&lt;/td>
 &lt;td>Scale&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The future is not decentralized vs centralized. It is a world of architecturally honest hybrid systems.&lt;/p></description></item><item><title>Part 5: Smart Contracts + AI Agents: Autonomous Systems</title><link>https://blog-old.508.dev/posts/part-5-smart-contracts-ai-agents-autonomous-systems/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog-old.508.dev/posts/part-5-smart-contracts-ai-agents-autonomous-systems/</guid><description>&lt;h2 class="heading-element" id="-series-navigation">&lt;span>📚 Series Navigation&lt;/span>
 &lt;a href="#-series-navigation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-1-ai-blockchain-cloud-who-does-what/">Part 1: AI, Blockchain, and Cloud: Who Actually Does What?&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-2-why-fully-decentralized-ai-is-a-myth/">Part 2: Why Fully Decentralized AI Is (Mostly) a Myth&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-3-web3-data-to-cloud-ml-pipelines/">Part 3: Web3 Data -&amp;gt; Cloud ML Pipelines (Spark in Practice)&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-4-ai-for-blockchain-fraud-anomaly-detection/">Part 4: AI for Blockchain Fraud &amp;amp; Anomaly Detection&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>Part 5: Smart Contracts + AI Agents: Autonomous Systems&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-6-what-comes-next-predictions/">Part 6: Auditable AI: Using Blockchain for Trust &amp;amp; Governance&lt;/a>&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="smart-contracts--ai-agents-autonomous-systems">&lt;span>Smart Contracts + AI Agents: Autonomous Systems&lt;/span>
 &lt;a href="#smart-contracts--ai-agents-autonomous-systems" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/images/ai-web3-series/part5-agents.png' alt="Part 5 overview">&lt;/p>
&lt;p>Smart contracts are deterministic enforcement engines. AI agents are adaptive decision engines. Combine them safely by treating agent output as untrusted input and enforcing guardrails on-chain. The chain should enforce invariants, not run the model.&lt;/p>
&lt;h2 class="heading-element" id="-case-study-autonomous-rebalancing-with-hard-caps">&lt;span>🧩 Case Study: Autonomous Rebalancing With Hard Caps&lt;/span>
 &lt;a href="#-case-study-autonomous-rebalancing-with-hard-caps" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>An AI agent proposes rebalances off-chain. On-chain contracts enforce max exposure, max daily turnover, and an emergency pause. The guardrails keep failure modes bounded even when the model is wrong.&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="architecture-patterns">&lt;span>Architecture patterns&lt;/span>
 &lt;a href="#architecture-patterns" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="proposal--validate--execute">&lt;span>Proposal → Validate → Execute&lt;/span>
 &lt;a href="#proposal--validate--execute" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>Agent proposes an action (signed payload)&lt;/li>
&lt;li>Contract validates caps/allowlists/thresholds&lt;/li>
&lt;li>Contract executes and emits audit events&lt;/li>
&lt;/ol>
&lt;h3 class="heading-element" id="oracle--attestation-pattern">&lt;span>Oracle / attestation pattern&lt;/span>
 &lt;a href="#oracle--attestation-pattern" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Contracts accept signed risk attestations from authorized signers and enforce freshness windows + nonces. This keeps decisions off-chain while preserving accountability.&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="guardrails-solidity">&lt;span>Guardrails (Solidity)&lt;/span>
 &lt;a href="#guardrails-solidity" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="exposure-caps--risk-threshold-baseline">&lt;span>Exposure caps + risk threshold (baseline)&lt;/span>
 &lt;a href="#exposure-caps--risk-threshold-baseline" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-solidity" data-lang="solidity">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">uint256&lt;/span> &lt;span class="k">constant&lt;/span> &lt;span class="n">MAX_EXPOSURE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="n">_000_000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nf">executeTrade&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint256&lt;/span> &lt;span class="n">exposure&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint256&lt;/span> &lt;span class="n">riskScore&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">external&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">exposure&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">MAX_EXPOSURE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Exposure too high&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">riskScore&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Risk too high&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...trade logic...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 class="heading-element" id="rate-limiting-prevent-fast-mistakes">&lt;span>Rate limiting (prevent fast mistakes)&lt;/span>
 &lt;a href="#rate-limiting-prevent-fast-mistakes" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-solidity" data-lang="solidity">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">uint256&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">lastTradeTs&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">uint256&lt;/span> &lt;span class="k">constant&lt;/span> &lt;span class="n">MIN_DELAY&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="kc">minutes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nf">executeTradeDelayed&lt;/span>&lt;span class="p">(...)&lt;/span> &lt;span class="k">external&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">block&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">timestamp&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">lastTradeTs&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">MIN_DELAY&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Rate limited&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lastTradeTs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">block&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">timestamp&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 class="heading-element" id="circuit-breaker--emergency-pause">&lt;span>Circuit breaker / emergency pause&lt;/span>
 &lt;a href="#circuit-breaker--emergency-pause" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-solidity" data-lang="solidity">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">paused&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">modifier&lt;/span> &lt;span class="nf">notPaused&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">paused&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Paused&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nf">setPaused&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">bool&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">external&lt;/span> &lt;span class="cm">/* onlyGuardian */&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paused&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="failure-modes-and-mitigations">&lt;span>Failure modes and mitigations&lt;/span>
 &lt;a href="#failure-modes-and-mitigations" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Failure mode&lt;/th>
 &lt;th>Mitigation&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Malicious/incorrect agent output&lt;/td>
 &lt;td>caps, allowlists, staged rollout&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Oracle compromise&lt;/td>
 &lt;td>multiple oracles, medianization, bounds checks&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Front-running / MEV&lt;/td>
 &lt;td>TWAP, slippage caps, commit-reveal&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Reorgs / finality&lt;/td>
 &lt;td>confirm-finality thresholds, idempotent ops&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Replay attacks&lt;/td>
 &lt;td>nonce + expiry + domain separation&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 class="heading-element" id="governance-patterns">&lt;span>Governance patterns&lt;/span>
 &lt;a href="#governance-patterns" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Multisig guardian for emergency pause and parameter updates&lt;/li>
&lt;li>DAO voting for policy-level changes (caps, allowlists, signer sets)&lt;/li>
&lt;li>Timelocks for upgrades&lt;/li>
&lt;/ul>
&lt;p>Governance is the safety net that turns an agent into a controlled system.&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="-implementation-checklist">&lt;span>✅ Implementation Checklist&lt;/span>
 &lt;a href="#-implementation-checklist" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Separate proposal (off-chain) from execution (on-chain)&lt;/li>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Validate caps/bounds/allowlists on-chain&lt;/li>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Add nonce + expiry to signed payloads&lt;/li>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Use rate limits, timelocks, and circuit breakers&lt;/li>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Emit audit events for every execution&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="-tradeoffs">&lt;span>⚖️ Tradeoffs&lt;/span>
 &lt;a href="#-tradeoffs" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Design&lt;/th>
 &lt;th>Pros&lt;/th>
 &lt;th>Cons&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Fully autonomous&lt;/td>
 &lt;td>fast&lt;/td>
 &lt;td>risky without strong guardrails&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Human approvals&lt;/td>
 &lt;td>safer&lt;/td>
 &lt;td>slower&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hybrid (recommended)&lt;/td>
 &lt;td>practical&lt;/td>
 &lt;td>more moving parts&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 class="heading-element" id="-further-reading">&lt;span>📚 Further Reading&lt;/span>
 &lt;a href="#-further-reading" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Smart contract security patterns (pause, timelock, allowlists)&lt;/li>
&lt;li>MEV/front-running mitigation writeups&lt;/li>
&lt;li>Oracle/attestation design patterns&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="takeaway">&lt;span>Takeaway&lt;/span>
 &lt;a href="#takeaway" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Let AI propose, let contracts enforce, and let governance control parameters. The &lt;code>executeTrade&lt;/code> snippet is only one guardrail pattern; production systems need caps, rate limits, attestations, and audit trails.&lt;/p></description></item><item><title>Part 4: AI for Blockchain Fraud &amp; Anomaly Detection</title><link>https://blog-old.508.dev/posts/part-4-ai-for-blockchain-fraud-anomaly-detection/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog-old.508.dev/posts/part-4-ai-for-blockchain-fraud-anomaly-detection/</guid><description>&lt;h2 class="heading-element" id="-series-navigation">&lt;span>📚 Series Navigation&lt;/span>
 &lt;a href="#-series-navigation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-1-ai-blockchain-cloud-who-does-what/">Part 1: AI, Blockchain, and Cloud: Who Actually Does What?&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-2-why-fully-decentralized-ai-is-a-myth/">Part 2: Why Fully Decentralized AI Is (Mostly) a Myth&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-3-web3-data-to-cloud-ml-pipelines/">Part 3: Web3 Data -&amp;gt; Cloud ML Pipelines (Spark in Practice)&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>Part 4: AI for Blockchain Fraud &amp;amp; Anomaly Detection&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-5-smart-contracts-ai-agents-autonomous-systems/">Part 5: Smart Contracts + AI Agents: Autonomous Systems&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-6-what-comes-next-predictions/">Part 6: Auditable AI: Using Blockchain for Trust &amp;amp; Governance&lt;/a>&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="ai-for-blockchain-fraud--anomaly-detection">&lt;span>AI for Blockchain Fraud &amp;amp; Anomaly Detection&lt;/span>
 &lt;a href="#ai-for-blockchain-fraud--anomaly-detection" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/images/ai-web3-series/part4-fraud.jpg' alt="Part 4 overview">&lt;/p>
&lt;h2 class="heading-element" id="fraud-is-behavioral">&lt;span>Fraud Is Behavioral&lt;/span>
 &lt;a href="#fraud-is-behavioral" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Most blockchain attacks do not break cryptography. They exploit human and system behavior. That means detection is about spotting deviations from normal activity, not finding a single magic signature.&lt;/p>
&lt;h2 class="heading-element" id="common-fraud-patterns">&lt;span>Common Fraud Patterns&lt;/span>
 &lt;a href="#common-fraud-patterns" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Wash trading&lt;/li>
&lt;li>Sybil wallets&lt;/li>
&lt;li>Bot farms&lt;/li>
&lt;li>Flash-loan abuse&lt;/li>
&lt;/ul>
&lt;h2 class="heading-element" id="feature-engineering-examples">&lt;span>Feature Engineering Examples&lt;/span>
 &lt;a href="#feature-engineering-examples" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Feature&lt;/th>
 &lt;th>Signal&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>tx_rate&lt;/td>
 &lt;td>Automation&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>counterparty_entropy&lt;/td>
 &lt;td>Wallet diversity&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>value_variance&lt;/td>
 &lt;td>Manipulation&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>These features are cheap to compute and hold up across chains.&lt;/p>
&lt;h2 class="heading-element" id="baseline-anomaly-detection-continuous-scores-features-defined">&lt;span>Baseline anomaly detection (continuous scores; features defined)&lt;/span>
 &lt;a href="#baseline-anomaly-detection-continuous-scores-features-defined" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">sklearn.ensemble&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">IsolationForest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">features&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">1.2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.5&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">80.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.7&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">],&lt;/span> &lt;span class="n">dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">float&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">IsolationForest&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">contamination&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">random_state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">42&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">features&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decision_function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">features&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">risk_scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">scores&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Use the continuous scores to rank alerts before applying thresholds.&lt;/p>
&lt;h2 class="heading-element" id="blockchain-integration">&lt;span>Blockchain Integration&lt;/span>
 &lt;a href="#blockchain-integration" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Store scores on-chain&lt;/li>
&lt;li>Trigger smart-contract rules&lt;/li>
&lt;li>Maintain immutable audit trail&lt;/li>
&lt;/ul>
&lt;p>On-chain writes should be sparse: store decisions or summaries, not every feature.&lt;/p>
&lt;h2 class="heading-element" id="conclusion">&lt;span>Conclusion&lt;/span>
 &lt;a href="#conclusion" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>AI detects. Blockchain enforces.&lt;/p>
&lt;h2 class="heading-element" id="-further-reading">&lt;span>📚 Further Reading&lt;/span>
 &lt;a href="#-further-reading" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.lamda.nju.edu.cn/publication/icdm08b.pdf"target="_blank" rel="external nofollow noopener noreferrer">Isolation Forest (Liu, Ting, Zhou, 2008) — PDF&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rekt.news/"target="_blank" rel="external nofollow noopener noreferrer">Rekt News (exploit writeups)&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://de.fi/rekt-database"target="_blank" rel="external nofollow noopener noreferrer">De.Fi REKT Database (exploit index)&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://roninchain.com/blog/posts/back-to-building-ronin-security-breach-6513cc78a5edc1001b03c364"target="_blank" rel="external nofollow noopener noreferrer">Ronin bridge security breach postmortem&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.elliptic.co/blog/the-poly-network-hack-600-million-in-crypto-stolen-and-returned-in-24-hours"target="_blank" rel="external nofollow noopener noreferrer">Poly Network hack analysis (Elliptic)&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Part 3: Web3 Data -> Cloud ML Pipelines (Spark in Practice)</title><link>https://blog-old.508.dev/posts/part-3-web3-data-to-cloud-ml-pipelines/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog-old.508.dev/posts/part-3-web3-data-to-cloud-ml-pipelines/</guid><description>&lt;h2 class="heading-element" id="-series-navigation">&lt;span>📚 Series Navigation&lt;/span>
 &lt;a href="#-series-navigation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-1-ai-blockchain-cloud-who-does-what/">Part 1: AI, Blockchain, and Cloud: Who Actually Does What?&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-2-why-fully-decentralized-ai-is-a-myth/">Part 2: Why Fully Decentralized AI Is (Mostly) a Myth&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>Part 3: Web3 Data -&amp;gt; Cloud ML Pipelines (Spark in Practice)&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-4-ai-for-blockchain-fraud-anomaly-detection/">Part 4: AI for Blockchain Fraud &amp;amp; Anomaly Detection&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-5-smart-contracts-ai-agents-autonomous-systems/">Part 5: Smart Contracts + AI Agents: Autonomous Systems&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-6-what-comes-next-predictions/">Part 6: Auditable AI: Using Blockchain for Trust &amp;amp; Governance&lt;/a>&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="web3-data---cloud-ml-pipelines-spark-in-practice">&lt;span>Web3 Data -&amp;gt; Cloud ML Pipelines (Spark in Practice)&lt;/span>
 &lt;a href="#web3-data---cloud-ml-pipelines-spark-in-practice" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/images/ai-web3-series/part3-pipeline.png' alt="Part 3 overview">&lt;/p>
&lt;h2 class="heading-element" id="why-blockchain-data-is-perfect-for-ml">&lt;span>Why Blockchain Data Is Perfect for ML&lt;/span>
 &lt;a href="#why-blockchain-data-is-perfect-for-ml" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Blockchains are:&lt;/p>
&lt;ul>
&lt;li>Append-only&lt;/li>
&lt;li>Time-ordered&lt;/li>
&lt;li>Public&lt;/li>
&lt;li>Behavior-rich&lt;/li>
&lt;/ul>
&lt;p>This makes them ideal for feature engineering because you can derive rates, burstiness, and counterparty diversity directly from the ledger.&lt;/p>
&lt;h2 class="heading-element" id="reference-architecture">&lt;span>Reference Architecture&lt;/span>
 &lt;a href="#reference-architecture" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Blockchain Node&lt;/li>
&lt;li>-&amp;gt; S3 (raw JSON)&lt;/li>
&lt;li>-&amp;gt; Spark (ETL + features)&lt;/li>
&lt;li>-&amp;gt; ML model&lt;/li>
&lt;li>-&amp;gt; Predictions on-chain&lt;/li>
&lt;/ul>
&lt;p>Treat the chain as the source of truth and let the cloud absorb the heavy compute.&lt;/p>
&lt;h2 class="heading-element" id="pyspark-example">&lt;span>PySpark Example&lt;/span>
 &lt;a href="#pyspark-example" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">spark&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;s3://eth/tx/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">features&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">groupBy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;wallet&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">agg&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;*&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">alias&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;tx_count&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">alias&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;total_value&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 class="heading-element" id="optional-commit-scores-on-chain-valid-python">&lt;span>Optional: commit scores on-chain (valid Python)&lt;/span>
 &lt;a href="#optional-commit-scores-on-chain-valid-python" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hashlib&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># w = wallet, s = score, ver = model version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">payload&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;wallet&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">w&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;score&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ver&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="n">sort_keys&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">commitment&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sha256&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">payload&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hexdigest&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This keeps outputs auditable without pushing full inference on-chain.&lt;/p>
&lt;h2 class="heading-element" id="ml-applications">&lt;span>ML Applications&lt;/span>
 &lt;a href="#ml-applications" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Wallet risk scoring&lt;/li>
&lt;li>Whale detection&lt;/li>
&lt;li>Bot identification&lt;/li>
&lt;li>Market behavior analysis&lt;/li>
&lt;/ul>
&lt;h2 class="heading-element" id="why-cloud-wins">&lt;span>Why Cloud Wins&lt;/span>
 &lt;a href="#why-cloud-wins" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Only cloud platforms provide:&lt;/p>
&lt;ul>
&lt;li>Elastic compute&lt;/li>
&lt;li>Distributed storage&lt;/li>
&lt;li>Mature ML tooling&lt;/li>
&lt;/ul>
&lt;h2 class="heading-element" id="closing">&lt;span>Closing&lt;/span>
 &lt;a href="#closing" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Web3 generates data. Cloud turns it into intelligence, and the chain preserves the audit trail.&lt;/p>
&lt;h2 class="heading-element" id="-further-reading">&lt;span>📚 Further Reading&lt;/span>
 &lt;a href="#-further-reading" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://mlflow.org/docs/latest/ml/getting-started/"target="_blank" rel="external nofollow noopener noreferrer">MLflow Getting Started&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://spark.apache.org/docs/latest/sql-performance-tuning.html"target="_blank" rel="external nofollow noopener noreferrer">Apache Spark SQL Performance Tuning&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://spark.apache.org/docs/latest/tuning.html"target="_blank" rel="external nofollow noopener noreferrer">Apache Spark Tuning Guide&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.databricks.com/discover/pages/optimize-data-workloads-guide"target="_blank" rel="external nofollow noopener noreferrer">Databricks Optimization Guide (Spark/Delta best practices)&lt;i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true">&lt;/i>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Part 2: Why Fully Decentralized AI Is (Mostly) a Myth</title><link>https://blog-old.508.dev/posts/part-2-why-fully-decentralized-ai-is-a-myth/</link><pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog-old.508.dev/posts/part-2-why-fully-decentralized-ai-is-a-myth/</guid><description>&lt;h2 class="heading-element" id="-series-navigation">&lt;span>📚 Series Navigation&lt;/span>
 &lt;a href="#-series-navigation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-1-ai-blockchain-cloud-who-does-what/">Part 1: AI, Blockchain, and Cloud: Who Actually Does What?&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>Part 2: Why Fully Decentralized AI Is (Mostly) a Myth&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-3-web3-data-to-cloud-ml-pipelines/">Part 3: Web3 Data -&amp;gt; Cloud ML Pipelines (Spark in Practice)&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-4-ai-for-blockchain-fraud-anomaly-detection/">Part 4: AI for Blockchain Fraud &amp;amp; Anomaly Detection&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-5-smart-contracts-ai-agents-autonomous-systems/">Part 5: Smart Contracts + AI Agents: Autonomous Systems&lt;/a>&lt;/strong>&lt;br>
👉 &lt;strong>&lt;a href="https://blog-old.508.dev/posts/part-6-what-comes-next-predictions/">Part 6: Auditable AI: Using Blockchain for Trust &amp;amp; Governance&lt;/a>&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="why-fully-decentralized-ai-is-mostly-a-myth">&lt;span>Why Fully Decentralized AI Is (Mostly) a Myth&lt;/span>
 &lt;a href="#why-fully-decentralized-ai-is-mostly-a-myth" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;img loading="lazy" src='https://blog-old.508.dev/images/ai-web3-series/part2-myth.png' alt="Part 2 overview">&lt;/p>
&lt;h2 class="heading-element" id="the-promise-vs-reality">&lt;span>The Promise vs Reality&lt;/span>
 &lt;a href="#the-promise-vs-reality" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Decentralized AI promises trustless, censorship-resistant intelligence. The problem is physics and economics, not ideology. At scale, bandwidth, scheduling, and power costs dominate the design.&lt;/p>
&lt;h2 class="heading-element" id="hard-constraints-engineers-cannot-ignore">&lt;span>Hard Constraints Engineers Cannot Ignore&lt;/span>
 &lt;a href="#hard-constraints-engineers-cannot-ignore" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Constraint&lt;/th>
 &lt;th>Why It Breaks DeAI&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GPUs&lt;/td>
 &lt;td>Scarce, expensive, centralized&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Latency&lt;/td>
 &lt;td>On-chain is not real-time&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cost&lt;/td>
 &lt;td>Inference at scale is costly&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tooling&lt;/td>
 &lt;td>ML stacks assume cloud&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>These constraints show up immediately once you push beyond toy workloads, especially when you need consistent latency.&lt;/p>
&lt;h2 class="heading-element" id="the-gpu-problem">&lt;span>The GPU Problem&lt;/span>
 &lt;a href="#the-gpu-problem" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Training and inference require:&lt;/p>
&lt;ul>
&lt;li>High-bandwidth memory&lt;/li>
&lt;li>Fast interconnects&lt;/li>
&lt;li>Centralized scheduling&lt;/li>
&lt;/ul>
&lt;p>This naturally pushes AI workloads toward cloud hyperscalers.&lt;/p>
&lt;h2 class="heading-element" id="what-actually-works">&lt;span>What Actually Works&lt;/span>
 &lt;a href="#what-actually-works" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Centralized inference&lt;/li>
&lt;li>Decentralized verification&lt;/li>
&lt;li>Token incentives for contributors&lt;/li>
&lt;li>Cryptographic proofs of output&lt;/li>
&lt;/ul>
&lt;p>The pattern is hybrid by design: compute where it is efficient, and verify where it is trust-minimized.&lt;/p>
&lt;h2 class="heading-element" id="-case-study-decentralized-inference-marketplace">&lt;span>🧩 Case Study: Decentralized Inference Marketplace&lt;/span>
 &lt;a href="#-case-study-decentralized-inference-marketplace" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>A startup attempted token-incentivized GPU nodes. The result was inconsistent uptime, latency spikes, and a centralized fallback for reliability. Incentives helped utilization, but not the tail latency that production systems care about.&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="-implementation-checklist">&lt;span>✅ Implementation Checklist&lt;/span>
 &lt;a href="#-implementation-checklist" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Measure GPU economics&lt;/li>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Compare latency vs block time&lt;/li>
&lt;li data-task=" " title="Unchecked">&lt;i class="checkbox-icon fa-fw fa-regular fa-square" aria-hidden="true">&lt;/i>Separate governance decentralization from compute&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="-tradeoffs">&lt;span>⚖️ Tradeoffs&lt;/span>
 &lt;a href="#-tradeoffs" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Model&lt;/th>
 &lt;th>Pros&lt;/th>
 &lt;th>Cons&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Centralized&lt;/td>
 &lt;td>Reliable&lt;/td>
 &lt;td>Trust needed&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fully DeAI&lt;/td>
 &lt;td>Ideologically pure&lt;/td>
 &lt;td>Unstable&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hybrid&lt;/td>
 &lt;td>Practical&lt;/td>
 &lt;td>Slightly complex&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 class="heading-element" id="engineering-reality-solidity">&lt;span>Engineering Reality (Solidity)&lt;/span>
 &lt;a href="#engineering-reality-solidity" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-solidity" data-lang="solidity">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">mapping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">bytes32&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="kt">address&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">inferenceProducer&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>You do not decentralize GPUs. You decentralize trust in results.&lt;/p>
&lt;h2 class="heading-element" id="conclusion">&lt;span>Conclusion&lt;/span>
 &lt;a href="#conclusion" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Decentralized AI is not dead, but it will always be hybrid in production.&lt;/p>
&lt;h2 class="heading-element" id="-further-reading">&lt;span>📚 Further Reading&lt;/span>
 &lt;a href="#-further-reading" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>ZKML research papers&lt;/li>
&lt;li>Rollup architecture discussions&lt;/li>
&lt;/ul></description></item></channel></rss>