<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bluetick Consultants Inc.</title>
    <description>The latest articles on DEV Community by Bluetick Consultants Inc. (@bluetickconsultants_inc).</description>
    <link>https://dev.to/bluetickconsultants_inc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3273921%2F2a78c1ac-079c-403d-a8f9-8a49d939b041.png</url>
      <title>DEV Community: Bluetick Consultants Inc.</title>
      <link>https://dev.to/bluetickconsultants_inc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bluetickconsultants_inc"/>
    <language>en</language>
    <item>
      <title>Your iPhone App on the iPhone Duo: What Breaks, What to Fix, and What It Costs</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Wed, 16 Sep 2026 09:50:51 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/your-iphone-app-on-the-iphone-duo-what-breaks-what-to-fix-and-what-it-costs-2l7p</link>
      <guid>https://dev.to/bluetickconsultants_inc/your-iphone-app-on-the-iphone-duo-what-breaks-what-to-fix-and-what-it-costs-2l7p</guid>
      <description>&lt;p&gt;&lt;strong&gt;Published:&lt;/strong&gt; 16 September 2026 | &lt;strong&gt;Updated:&lt;/strong&gt; 16 September 2026&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; To prepare your app for iPhone Duo, rebuild it with the iOS 27.1 SDK before the phone goes on sale on October 23. Apps built with older SDKs keep working, but they sit boxed in black space on both screens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; Fix orientation-based layouts, &lt;code&gt;UIScreen.main&lt;/code&gt; calls and equal-margin maths first. Apple’s fees are trivial; engineering and testing time is the real cost, ranging from a few hours for iPad-ready apps to several days for phone-only apps.&lt;/p&gt;

&lt;p&gt;On October 23, some of your most valuable customers will open your app on a phone that costs $1,999 and folds in half. If nobody has touched the app in a while, it will not crash. It will do something arguably worse. It will sit in a box in the middle of a 7.6-inch screen, black space all around it, looking like it was made for a different phone. Which, to be fair, it was.&lt;/p&gt;

&lt;p&gt;Nobody files a bug report about this. Instead, people just notice that Netflix fills the screen and your app does not, and they draw their own conclusions about which company is paying attention.&lt;/p&gt;

&lt;p&gt;That is the real risk with Apple’s first foldable. The app keeps working. It just looks abandoned, on an iPhone with the highest starting price Apple has ever charged, held by the kind of people who tend to pay for apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we’re solving
&lt;/h2&gt;

&lt;p&gt;The goal here is narrow: get an existing iPhone app to look deliberate on both of the iPhone Duo’s screens, in every way people will hold it. Closed, it is a 5.4-inch phone. Open, it is a 7.6-inch small tablet. Both screens have roughly a 1.4:1 shape, which is much squarer than any iPhone before it. A regular iPhone held sideways is closer to 2.17:1. So neither screen is a shape your layouts have seen.&lt;/p&gt;

&lt;p&gt;The phone ships with iOS 27.1. Pre-orders open October 16, and it goes on sale October 23.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much of the screen you get depends on how you last built the app
&lt;/h3&gt;

&lt;p&gt;Apple has set up three tiers. Which one your app lands in depends on the SDK, meaning the version of Apple’s developer toolkit the app was last compiled with. First, moving up a tier starts with rebuilding against a newer SDK. Apple’s developer session also covers opting in to the full-screen experience, and making good use of the extra space is a separate job again.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Last built with&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What happens on the Duo&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;How it looks&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;An SDK older than iOS 27&lt;/td&gt;
&lt;td&gt;Runs in a compatibility box, with black filling the rest. This happens on both screens, not just the inner one.&lt;/td&gt;
&lt;td&gt;Clearly unoptimized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 27 SDK (Xcode 27)&lt;/td&gt;
&lt;td&gt;On the inner screen, the app extends into the space beside the status bar but stops short of the edge.&lt;/td&gt;
&lt;td&gt;Acceptable, some dead space&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 27.1 SDK (Xcode 27.1)&lt;/td&gt;
&lt;td&gt;Reaches the screen edges. Standard navigation and toolbar buttons move to the side, laid out vertically.&lt;/td&gt;
&lt;td&gt;What Apple showed on stage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Two things the early headlines got wrong
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Xcode 27.1 is not out yet.&lt;/strong&gt; Some coverage said the new Xcode, with its iPhone Duo simulator, is already available. As of today, Apple’s own &lt;a href="https://developer.apple.com/iphone-duo/" rel="noopener noreferrer"&gt;Get Ready for iPhone Duo page&lt;/a&gt; lists the Xcode 27.1 beta as “coming later this month.” Apple’s developer videos demo the simulator, but you cannot download it. That changes the planning maths. With launch on October 23, most teams will get a few weeks with the simulator, not six.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The outer screen does not rescue old apps.&lt;/strong&gt; Early reports suggested older apps would look fine when the phone is closed. The outer screen is not shaped like any earlier iPhone, and legacy builds are boxed on both displays. If your plan was to rely on people using the phone closed, drop it.&lt;/p&gt;

&lt;p&gt;Out of scope for this post: Apple Pencil support (Apple says it arrives later in 2026), the Duo-only camera features, and iPad-only apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real example
&lt;/h2&gt;

&lt;p&gt;Netflix is the clearest case so far. Apple worked with it before launch and put it on stage, alongside Zoom, Slack and a few others. What Netflix did is worth studying because it goes past “fill the screen.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One activity, two screens.&lt;/strong&gt; You can scroll the short Clips feed on the outer screen, then open the phone and carry on in the same place on the big one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The half-open pose has its own layout.&lt;/strong&gt; Stand the phone up like a tiny laptop and the video stays on the top half while the playback controls drop to the bottom half.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zoom took a similar line.&lt;/strong&gt; On the inner screen, it shows the shared content and the other participants together, instead of making you pick one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, keep this in proportion. That is a handful of large companies with early access and Apple engineers on call. It is not evidence that the wider App Store is ready.&lt;/p&gt;

&lt;p&gt;We have seen this film before. When the taller iPhone 5 arrived in 2012, &lt;a href="https://www.bluetickconsultants.com/digital-transformation/" rel="noopener noreferrer"&gt;apps that had not been updated&lt;/a&gt; ran with black bars at the top and bottom. When the iPhone X arrived in 2017, apps not rebuilt for iOS 11 were letterboxed the same way. Both times, the bars became the quickest way for users to spot an abandoned app. Similarly, Instagram went well over a decade without a proper iPad app, leaving iPad owners with a blown-up phone app. The Duo raises the stakes, because the device exposing the neglect is the phone people carry every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works (with code)
&lt;/h2&gt;

&lt;p&gt;In fact, most of this is not new work. Apple has been pushing developers toward flexible layouts for years, through size classes, safe areas and resizable iPad windows. If your app already behaves well on an iPad in Split View, you are most of the way there. If your app was built for “an iPhone,” singular, you have a list.&lt;/p&gt;

&lt;h3&gt;
  
  
  The habits that break on a folding iPhone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choosing the layout by orientation.&lt;/strong&gt; The inner screen ignores the orientations your app says it supports. A portrait-only app will not stay portrait-only once the phone is open. Apple’s advice is to decide layout by size class instead. Size classes are Apple’s way of describing available space as “compact” or “regular.” The outer screen behaves like a normal iPhone. The inner one, by contrast, is regular in both directions, like an iPad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asking for “the main screen”.&lt;/strong&gt; Code that calls &lt;code&gt;UIScreen.main&lt;/code&gt; assumes there is one screen. There are now two, and Apple says this API will be deprecated. Instead, get the screen from the window the app is actually in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assuming the margins are equal.&lt;/strong&gt; The status bar and camera now sit in a corner, so the safe area is often wider on one side than the other. Any maths that doubles the left inset to get the usable width will be wrong.&lt;/li&gt;
&lt;li&gt;*&lt;em&gt;Hand-built navigation bars. *&lt;/em&gt; &lt;a href="https://developer.apple.com/videos/play/tech-talks/111462/" rel="noopener noreferrer"&gt;Apple’s standard navigation components&lt;/a&gt; adapt on their own, and can show a sidebar on the inner screen with one setting. In contrast, custom bars can collide with system elements. iOS 27.1 adds reserved regions (&lt;code&gt;ReservedRegion&lt;/code&gt; in SwiftUI, &lt;code&gt;UIViewReservedRegion&lt;/code&gt; in UIKit) so custom controls can take space without overlapping the system’s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting the in-between states.&lt;/strong&gt; For example, Split View gives your app half the inner screen with uneven margins. In the half-folded pose, controls need to stay clear of the crease. These in-between states are where most layout bugs will hide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assuming a big screen means no black bars on video.&lt;/strong&gt; A 1.4:1 screen is close to the IMAX shape, so standard widescreen video still shows bars, just at the top and bottom instead of the sides. Good video apps will use that space for controls or information, the way Netflix does.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the fix looks like
&lt;/h3&gt;

&lt;p&gt;Here are two of the most common fixes, adapted from Apple’s “&lt;a href="https://developer.apple.com/videos/play/tech-talks/111461/" rel="noopener noreferrer"&gt;Prepare your app for iPhone Duo&lt;/a&gt;” session. The before lines assume one screen and symmetric margins. The after lines ask the system instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: assumes one screen and equal margins&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;safeAreaInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;// After: asks the current window and handles each side&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;traitCollection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;displayScale&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;safeAreaInsets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A small audit script to size the job before the simulator arrives
&lt;/h3&gt;

&lt;p&gt;Since nobody can run the Duo simulator yet, the useful thing to do this week is estimate. The script below scans an iOS codebase for the patterns above and prints each suspect line with a plain-English fix. Run it from your project folder with &lt;code&gt;python3 duo_audit.py path/to/YourApp&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;

&lt;span class="c1"&gt;# Habits Apple's iPhone Duo guidance warns about, with a plain fix
&lt;/span&gt;&lt;span class="n"&gt;RULES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UIScreen\.main&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Two screens now. Get the screen from the window scene.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UIDevice\.current\.orientation|supportedInterfaceOrientations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Inner display ignores orientation locks. Use size classes.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;safeAreaInsets\.(left|right)\s*\*\s*2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Assumes equal left/right insets. Duo insets are uneven.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userInterfaceIdiom\s*==\s*\.phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duo is still a phone. Don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t guess screen size from it.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width:\s*(375|390|393|402|414|428|430|440)\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hard-coded iPhone width. Let the layout flex.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rglob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.swift&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;advice&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;RULES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="n"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;advice&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; possible iPhone Duo layout issue(s) found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output on a two-file sample project:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HomeView.swift:6  .frame(width: 393)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; Hard-coded iPhone width. Let the layout flex.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;PlayerViewController.swift:6  let scale = UIScreen.main.scale&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; Two screens now. Get the screen from the window scene.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;PlayerViewController.swift:7  let usable = view.bounds.width – view.safeAreaInsets.left * 2&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; Assumes equal left/right insets. Duo insets are uneven.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;PlayerViewController.swift:8  if UIDevice.current.orientation.isLandscape {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; Inner display ignores orientation locks. Use size classes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;4 possible iPhone Duo layout issue(s) found.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; reads every Swift file, checks each line against five risky patterns, and prints the file, the line and what to do about it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it helps:&lt;/strong&gt; four hits in two files is an afternoon. Four hundred hits across a large app is a sprint, and you want to know that before October, not after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What it is not:&lt;/strong&gt; a compiler or a test. It flags suspects by text matching, so expect some false alarms, and it will miss layouts that are wrong for other reasons. Treat the count as a sizing signal, then confirm everything in the simulator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, Apple is shipping its own help. Xcode 27.1 includes a coding skill Apple calls App Resizability, an updated version of the modernization skill it introduced for UIKit apps this year, now covering SwiftUI and the Duo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;The money Apple charges is almost nothing. The Apple Developer Program is $99 a year, which you are already paying if your app is on the App Store. Likewise, Xcode and the simulator are free. A real iPhone Duo for testing starts at $1,999, but most teams will not have one before launch day anyway.&lt;/p&gt;

&lt;p&gt;The real cost, however, is engineering and testing time. &lt;a href="https://pasqualepillitteri.it/en/news/15360/iphone-duo-prepare-apps-developers" rel="noopener noreferrer"&gt;Early developer write-ups&lt;/a&gt; put the work at a few hours for a well-built app that already handles iPad, and several days plus testing for a phone-only app with hand-coded layouts. The other ranges below are our estimates, based on those figures and on past iPhone screen changes. Prices were checked on September 11, 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost options compared
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Option&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Upfront cost&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ongoing cost&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Hidden costs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Do nothing&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;App looks boxed-in on both screens, next to competitors that don’t&lt;/td&gt;
&lt;td&gt;Apps in maintenance mode with few iPhone users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuild with the iOS 27 SDK only&lt;/td&gt;
&lt;td&gt;About 1-2 days of rebuild and regression testing (estimate)&lt;/td&gt;
&lt;td&gt;Normal release cycle&lt;/td&gt;
&lt;td&gt;Still leaves dead space on the inner screen&lt;/td&gt;
&lt;td&gt;Teams already shipping an iOS 27 update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adopt iOS 27.1, mostly standard UI&lt;/td&gt;
&lt;td&gt;A few hours to a few days&lt;/td&gt;
&lt;td&gt;More QA per release&lt;/td&gt;
&lt;td&gt;Test matrix grows; no real device until Oct 23&lt;/td&gt;
&lt;td&gt;Apps built on Apple’s standard navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adopt iOS 27.1, heavily custom UI&lt;/td&gt;
&lt;td&gt;Several days to a few weeks (estimate)&lt;/td&gt;
&lt;td&gt;Ongoing layout upkeep&lt;/td&gt;
&lt;td&gt;Custom bars and players need rework; design time&lt;/td&gt;
&lt;td&gt;Media, camera, games, custom design systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build Duo-specific features&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.bluetickconsultants.com/capabilities/" rel="noopener noreferrer"&gt;A product project&lt;/a&gt;; depends on scope&lt;/td&gt;
&lt;td&gt;Feature maintenance&lt;/td&gt;
&lt;td&gt;Design and product time for a small early audience&lt;/td&gt;
&lt;td&gt;Video, conferencing, reading, productivity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The hidden cost: a bigger test matrix
&lt;/h3&gt;

&lt;p&gt;One hidden cost applies to every option except the first. The testing matrix grows for good: two screens, two orientations on each, the half-folded pose and Split View. For a solo developer that might be an extra hour per release. On the other hand, for a team with a formal QA cycle, it needs to be written into the test plan now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and cons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  In favour of doing the work now
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A valuable audience.&lt;/strong&gt; People who pay $1,999 for a phone are, on average, more willing to pay for apps. Being polished on day one is cheap marketing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The work carries over.&lt;/strong&gt; Flexible layout that fixes the Duo also improves your app on iPad, in resizable windows, and when mirrored to a Mac. This is not a one-device project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple’s standard components do much of it for you.&lt;/strong&gt; Apps built on standard navigation get the sidebar and the side-mounted controls largely for free after a rebuild.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cost of entry is low.&lt;/strong&gt; The tooling is free, and for tidy codebases the job is measured in hours.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Against, or at least against rushing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The audience is small at first.&lt;/strong&gt; Even Apple-focused press expects the Duo to be niche to start. For most apps, standard iPhones will be almost all of the traffic for a long while.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The timeline is tight.&lt;/strong&gt; The simulator is still weeks away and real hardware arrives on launch day. In other words, everything before October 23 is testing on a simulator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The testing burden is permanent.&lt;/strong&gt; As a result, every future release has more screens and states to check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is a first-generation platform.&lt;/strong&gt; Apple’s written guide to preparing apps is still marked as coming. Expect the advice to shift once real people start using the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The honest objection.&lt;/strong&gt; For an app people open for thirty seconds to pay for parking, a boxed-in compatibility view is ugly but perfectly usable. Consequently, spending a sprint on it may never pay back. Fix the cheap things, rebuild, and move on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Old iPhone apps will not break on the iPhone Duo. They will look boxed-in on both screens, and users will read that as neglect.&lt;/li&gt;
&lt;li&gt;The SDK you build with decides how much screen you get. Edge-to-edge needs the iOS 27.1 SDK.&lt;/li&gt;
&lt;li&gt;As of September 11, the Xcode 27.1 beta is not out yet. Apple says later this month, and the phone ships October 23, so audit your code now and test the moment it lands.&lt;/li&gt;
&lt;li&gt;The biggest code risks are orientation-based layout, references to the main screen, equal-margin maths and custom navigation bars.&lt;/li&gt;
&lt;li&gt;Apple’s fees are trivial. &lt;a href="https://www.bluetickconsultants.com/on-demand-ai-delivery-pods/" rel="noopener noreferrer"&gt;Engineering and testing time is the real budget&lt;/a&gt;, and most of that work also improves your app on iPad and Mac.&lt;/li&gt;
&lt;li&gt;Prioritise by audience. Video, conferencing and productivity apps should move first; short-session utility apps can rebuild and wait.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What happens to an old iPhone app on the iPhone Duo?
&lt;/h3&gt;

&lt;p&gt;It keeps working, but apps last built with an SDK older than iOS 27 run in a compatibility box with black space around them, on both the outer and inner screens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which SDK do I need for my app to fill the iPhone Duo screen?
&lt;/h3&gt;

&lt;p&gt;The iOS 27.1 SDK, which ships with Xcode 27.1. Building with the iOS 27 SDK extends the app on the inner screen but still leaves dead space at the edge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Xcode 27.1 beta with the iPhone Duo simulator available yet?
&lt;/h3&gt;

&lt;p&gt;Not as of September 16, 2026. Apple’s Get Ready for iPhone Duo page lists the Xcode 27.1 beta as coming later this month. The iPhone Duo goes on sale October 23.&lt;/p&gt;

&lt;h3&gt;
  
  
  What code patterns break on the iPhone Duo?
&lt;/h3&gt;

&lt;p&gt;The biggest risks are choosing layout by orientation instead of size class, calling UIScreen.main, assuming equal left and right safe-area margins, and hand-built navigation bars that can collide with system elements.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take to prepare your app for iPhone Duo?
&lt;/h3&gt;

&lt;p&gt;Early developer write-ups put it at a few hours for a well-built app that already handles iPad, and several days plus testing for a phone-only app with hand-coded layouts. Heavily custom interfaces can take several days to a few weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does preparing for the iPhone Duo cost anything beyond engineering time?
&lt;/h3&gt;

&lt;p&gt;Very little. The Apple Developer Program is $99 a year, which published apps already pay, and Xcode and the simulator are free. The real cost is engineering time and a permanently larger testing matrix.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/prepare-app-for-iphone-duo/" rel="noopener noreferrer"&gt;Your iPhone App on the iPhone Duo: What Breaks, What to Fix, and What It Costs&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>adaptivelayout</category>
      <category>appmodernization</category>
      <category>foldableiphone</category>
    </item>
    <item>
      <title>Database Indexing in Ruby on Rails: When, Why, and How</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Thu, 10 Sep 2026 17:53:11 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/database-indexing-in-ruby-on-rails-when-why-and-how-56ce</link>
      <guid>https://dev.to/bluetickconsultants_inc/database-indexing-in-ruby-on-rails-when-why-and-how-56ce</guid>
      <description>&lt;p&gt;&lt;strong&gt;Published:&lt;/strong&gt; 10 September 2026 | &lt;strong&gt;Updated:&lt;/strong&gt; 10 September 2026&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; Rails database indexing is often the highest-impact fix for slow queries once N+1 problems are solved. Index the queries you actually run: composite indexes for multi-column filters, partial indexes for the small slice of rows you query most, and algorithm: :concurrently for large production tables. Verify every index with EXPLAIN ANALYZE, because each extra index adds cost to every write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Guide Is For
&lt;/h2&gt;

&lt;p&gt;This guide is for Ruby on Rails developers, backend engineers, and engineering leads who run PostgreSQL in production and need to decide which indexes to add, change, or remove. It assumes you’re comfortable with ActiveRecord and migrations, but not that you’re a database specialist.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use This Advice
&lt;/h3&gt;

&lt;p&gt;Use the techniques in this guide when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A page, report, or API endpoint is slow, and &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; shows a Seq Scan on a large table.&lt;/li&gt;
&lt;li&gt;Database CPU spikes during peak traffic while your application servers have spare capacity.&lt;/li&gt;
&lt;li&gt;A table has grown from thousands of rows to millions, and queries that were once instant now take seconds.&lt;/li&gt;
&lt;li&gt;You need to add an index to a live production table without blocking writes.&lt;/li&gt;
&lt;li&gt;Write latency is creeping up, and you suspect unused or overlapping indexes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexing is the wrong fix in two cases. On small tables, a sequential scan is often faster than an index lookup. And if a page fires hundreds of small queries, fix the N+1 problem first, because no index can fix that pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Cases This Guide Covers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SaaS dashboards and reporting:&lt;/strong&gt; composite indexes for multi-column filters, as in the case study where an 8-second report dropped to under 500 milliseconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce and order management:&lt;/strong&gt; fast lookups by customer, order status, and date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soft deletes and archived records:&lt;/strong&gt; partial indexes that cover only the active rows you actually query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-traffic APIs:&lt;/strong&gt; unique indexes on email addresses, UUIDs, and external IDs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production schema changes:&lt;/strong&gt; concurrent index builds on large tables with zero downtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These patterns apply across SaaS, e-commerce, fintech, and logistics platforms, or any Rails application where data grows faster than caching can keep up.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“A single well-designed index can reduce a query from several seconds to a few milliseconds. But a poorly designed indexing strategy can slow down every write operation in your application.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As Ruby on Rails developers, we spend a lot of time optimizing ActiveRecord queries, &lt;a href="https://guides.rubyonrails.org/active_record_querying.html" rel="noopener noreferrer"&gt;eliminating N+1 queries&lt;/a&gt;, and &lt;a href="https://www.bluetickconsultants.com/rails-8s-solid-trifecta-do-you-still-need-redis/" rel="noopener noreferrer"&gt;adding caching layers&lt;/a&gt;. Yet one of the most impactful performance improvements often happens &lt;strong&gt;below the Rails application—in the database itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether you’re building a SaaS platform, an &lt;a href="https://www.bluetickconsultants.com/e-commerce/" rel="noopener noreferrer"&gt;e-commerce application&lt;/a&gt;, or an API that serves millions of requests, &lt;a href="https://www.bluetickconsultants.com/what-is-database-sharding-and-how-it-scaled-traffic-10x/" rel="noopener noreferrer"&gt;your database eventually becomes the bottleneck&lt;/a&gt;. When that happens, adding more application servers rarely solves the problem. Instead, the answer is often a better indexing strategy.&lt;/p&gt;

&lt;p&gt;In this article, we’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What database indexes are&lt;/li&gt;
&lt;li&gt;How indexes work internally&lt;/li&gt;
&lt;li&gt;Different types of indexes&lt;/li&gt;
&lt;li&gt;Partial indexes&lt;/li&gt;
&lt;li&gt;Composite indexes&lt;/li&gt;
&lt;li&gt;Zero-downtime indexing in production&lt;/li&gt;
&lt;li&gt;Drawbacks of excessive indexing&lt;/li&gt;
&lt;li&gt;Real-world Rails examples&lt;/li&gt;
&lt;li&gt;Best practices for production applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Understanding How Databases Search Data
&lt;/h2&gt;

&lt;p&gt;For example, imagine you have a library with five million books.&lt;/p&gt;

&lt;p&gt;When someone asks for a book by its title, there are two approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Without an Index
&lt;/h3&gt;

&lt;p&gt;First, the librarian starts from shelf one.&lt;/p&gt;

&lt;p&gt;Book 1&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Book 2&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Book 3&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;…&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Book 5,000,000&lt;/p&gt;

&lt;p&gt;Eventually the book is found.&lt;/p&gt;

&lt;p&gt;In fact, this is exactly what databases call a &lt;strong&gt;Sequential Scan (Seq Scan).&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  With an Index
&lt;/h3&gt;

&lt;p&gt;Instead of checking every shelf, the librarian opens the catalogue.&lt;/p&gt;

&lt;p&gt;Harry Potter → Shelf 18&lt;/p&gt;

&lt;p&gt;Rails Guide → Shelf 42&lt;/p&gt;

&lt;p&gt;Ruby Cookbook → Shelf 81&lt;/p&gt;

&lt;p&gt;As a result, the book is found immediately.&lt;/p&gt;

&lt;p&gt;In other words, that catalogue is essentially what a database index is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Exactly is an Index?
&lt;/h2&gt;

&lt;p&gt;An index is a &lt;strong&gt;special data structure&lt;/strong&gt; maintained by the database that stores values from one or more columns in a sorted format, along with pointers to the corresponding table rows.&lt;/p&gt;

&lt;p&gt;Most relational databases such as PostgreSQL and MySQL use a &lt;a href="https://www.postgresql.org/docs/current/indexes-types.html" rel="noopener noreferrer"&gt;B-Tree (Balanced Tree)&lt;/a&gt; as the default index type.&lt;/p&gt;

&lt;p&gt;Instead of scanning every row, the database traverses the tree.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           Root

          /      \

      A-M          N-Z

     /  \         /   \

  Adam Bob    Mike Zack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Searching becomes logarithmic rather than linear.&lt;/p&gt;

&lt;p&gt;Instead of checking five million rows, the database checks only a few levels of the tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working Example
&lt;/h2&gt;

&lt;p&gt;For instance, suppose we have this model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;create_table&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt; &lt;span class="ss"&gt;:city&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt; &lt;span class="ss"&gt;:status&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, the application frequently executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"john@example.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Without an Index
&lt;/h2&gt;

&lt;p&gt;SQL executed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execution plan:&lt;/p&gt;

&lt;p&gt;Seq Scan on customers&lt;/p&gt;

&lt;p&gt;Consequently, the database checks every row.&lt;/p&gt;

&lt;p&gt;With 5 million records:&lt;/p&gt;

&lt;p&gt;Row 1&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Row 2&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Row 3&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;…&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Row 5,000,000&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding an Index
&lt;/h2&gt;

&lt;p&gt;Migration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddEmailIndexToCustomers&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Migration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;7.1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;
    &lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails db:migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Afterward, the query changes dramatically.&lt;/p&gt;

&lt;p&gt;Execution plan:&lt;/p&gt;

&lt;p&gt;Index Scan&lt;/p&gt;

&lt;p&gt;Instead of scanning the table, PostgreSQL looks inside the index.&lt;/p&gt;

&lt;p&gt;Email Index&lt;/p&gt;

&lt;p&gt;&lt;a href="mailto:adam@example.com"&gt;adam@example.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;a href="mailto:john@example.com"&gt;john@example.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;a href="mailto:mary@example.com"&gt;mary@example.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Therefore, query execution becomes almost instantaneous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composite Indexes
&lt;/h2&gt;

&lt;p&gt;Similarly, suppose every dashboard request executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;customer_id: &lt;/span&gt;&lt;span class="n"&gt;current_customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bad approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:customer_id&lt;/span&gt;
&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:status&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:status&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now PostgreSQL can answer the query using a single index lookup instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partial Indexing
&lt;/h2&gt;

&lt;p&gt;This is one of the &lt;a href="https://www.postgresql.org/docs/current/indexes-partial.html" rel="noopener noreferrer"&gt;most underused yet powerful indexing techniques in PostgreSQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, suppose your application uses soft deletes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;deleted_at: &lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If 95% of your rows are deleted, why should PostgreSQL index them?&lt;/p&gt;

&lt;p&gt;Instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="ss"&gt;:deleted_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="ss"&gt;where: &lt;/span&gt;&lt;span class="s2"&gt;"deleted_at IS NULL"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thus, the index now contains only active customers.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller index&lt;/li&gt;
&lt;li&gt;Less storage&lt;/li&gt;
&lt;li&gt;Faster lookups&lt;/li&gt;
&lt;li&gt;Faster writes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Partial Index vs Regular Index
&lt;/h2&gt;

&lt;p&gt;| &lt;strong&gt;Regular Index&lt;/strong&gt; | &lt;strong&gt;Partial Index&lt;/strong&gt; |&lt;br&gt;
| Indexes every row | Indexes only matching rows |&lt;br&gt;
| Larger disk usage | Smaller disk usage |&lt;br&gt;
| Slower updates | Faster updates |&lt;br&gt;
| Useful for general searches | Useful for filtered searches |&lt;/p&gt;
&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Regular index&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Indexes:&lt;/p&gt;

&lt;p&gt;Active&lt;/p&gt;

&lt;p&gt;Inactive&lt;/p&gt;

&lt;p&gt;Pending&lt;/p&gt;

&lt;p&gt;Deleted&lt;/p&gt;

&lt;p&gt;Archived&lt;/p&gt;

&lt;p&gt;Partial index&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="ss"&gt;:status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="ss"&gt;where: &lt;/span&gt;&lt;span class="s2"&gt;"status='Active'"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Indexes only:&lt;/p&gt;

&lt;p&gt;Active&lt;/p&gt;

&lt;h2&gt;
  
  
  Achieving Zero Downtime While Adding Indexes
&lt;/h2&gt;

&lt;p&gt;In particular, one mistake developers make is running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a table with millions of rows, PostgreSQL may &lt;a href="https://www.postgresql.org/docs/current/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY" rel="noopener noreferrer"&gt;lock the table while building the index&lt;/a&gt;, blocking reads or writes depending on the operation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index" rel="noopener noreferrer"&gt;Rails supports concurrent index creation for PostgreSQL&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddEmailIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Migration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;7.1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;disable_ddl_transaction!&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;
    &lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="ss"&gt;algorithm: :concurrently&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why &lt;code&gt;disable_ddl_transaction!&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Specifically, PostgreSQL cannot create indexes concurrently inside a transaction. Rails wraps migrations in transactions by default, so you must disable it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No long table lock&lt;/li&gt;
&lt;li&gt;Reads continue&lt;/li&gt;
&lt;li&gt;Writes continue&lt;/li&gt;
&lt;li&gt;Safe for production deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this reason, this is the recommended approach for large production databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying the Index
&lt;/h2&gt;

&lt;p&gt;Above all, never assume the database is using your index.&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before indexing:&lt;/p&gt;

&lt;p&gt;Seq Scan&lt;/p&gt;

&lt;p&gt;After indexing:&lt;/p&gt;

&lt;p&gt;Index Scan&lt;/p&gt;

&lt;p&gt;Sometimes PostgreSQL still chooses a sequential scan if it estimates that scanning the table is cheaper, especially for very small tables or low-selectivity queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Too Many Indexes
&lt;/h2&gt;

&lt;p&gt;Still, many developers think:&lt;/p&gt;

&lt;p&gt;More indexes = Faster database.&lt;/p&gt;

&lt;p&gt;However, that’s not true.&lt;/p&gt;

&lt;p&gt;Every index must also be updated whenever data changes.&lt;br&gt;&lt;br&gt;
For instance, imagine this insert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without indexes:&lt;/p&gt;

&lt;p&gt;Insert Row&lt;/p&gt;

&lt;p&gt;With eight indexes:&lt;/p&gt;

&lt;p&gt;Insert Row&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Update Index 1&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Update Index 2&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Update Index 3&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;…&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Update Index 8&lt;/p&gt;

&lt;p&gt;In short, every additional index increases write overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drawbacks of Excessive Indexing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Slower INSERT operations&lt;/li&gt;
&lt;li&gt;Slower UPDATE operations&lt;/li&gt;
&lt;li&gt;Slower DELETE operations&lt;/li&gt;
&lt;li&gt;Increased storage usage&lt;/li&gt;
&lt;li&gt;Longer backup times&lt;/li&gt;
&lt;li&gt;Longer restore times&lt;/li&gt;
&lt;li&gt;Increased VACUUM maintenance in PostgreSQL&lt;/li&gt;
&lt;li&gt;More memory consumed by indexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hence, indexing should always be driven by actual query patterns, not guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Case Study
&lt;/h2&gt;

&lt;p&gt;In one of our &lt;a href="https://www.bluetickconsultants.com/case-studies/" rel="noopener noreferrer"&gt;production reporting systems&lt;/a&gt;, a dashboard loaded customer reports filtered by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer ID&lt;/li&gt;
&lt;li&gt;Reporting Group&lt;/li&gt;
&lt;li&gt;Status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Initially, the table had individual indexes on each column. The query planner still had to combine results, leading to response times of over &lt;strong&gt;8 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We analyzed the execution plan using &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; and replaced the individual indexes with a composite index matching the query pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:reports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:reporting_group_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:status&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="ss"&gt;algorithm: :concurrently&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the migration used &lt;code&gt;algorithm: :concurrently&lt;/code&gt; and &lt;code&gt;disable_ddl_transaction!&lt;/code&gt;, it was deployed to production without blocking application traffic.&lt;/p&gt;

&lt;p&gt;Overall, the results were significant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response time dropped from &lt;strong&gt;8 seconds to under 500 milliseconds&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Database CPU usage decreased during peak traffic&lt;/li&gt;
&lt;li&gt;No application code changes were required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, this reinforced an important lesson: understanding &lt;strong&gt;how your application queries data&lt;/strong&gt; is often more valuable than adding hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Index foreign keys used in joins.&lt;/li&gt;
&lt;li&gt;Use unique indexes for unique columns like email and UUIDs.&lt;/li&gt;
&lt;li&gt;Prefer composite indexes for common multi-column filters.&lt;/li&gt;
&lt;li&gt;Use partial indexes when only a subset of rows is queried frequently.&lt;/li&gt;
&lt;li&gt;Create indexes concurrently in production to avoid downtime.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/current/using-explain.html" rel="noopener noreferrer"&gt;Validate index usage with EXPLAIN ANALYZE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Remove unused indexes periodically.&lt;/li&gt;
&lt;li&gt;Monitor slow query logs and index bloat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When should I add a database index in Rails?
&lt;/h3&gt;

&lt;p&gt;Add an index when a column appears in frequent WHERE, JOIN, or ORDER BY clauses on a table large enough for sequential scans to hurt. Foreign keys, unique fields such as email, and columns behind slow dashboard filters are the usual candidates. Confirm the need with EXPLAIN ANALYZE rather than indexing speculatively.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between a composite index and a partial index?
&lt;/h3&gt;

&lt;p&gt;A composite index covers several columns in one index, such as customer_id and status, and serves queries that filter on those columns together. It works best when the query filters on the leading column. A partial index covers only rows matching a condition, such as active records, which keeps it smaller and cheaper to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does add_index lock the table in PostgreSQL?
&lt;/h3&gt;

&lt;p&gt;A standard add_index runs CREATE INDEX, which blocks inserts, updates, and deletes on the table until the build finishes, while reads continue. On large production tables, use algorithm: :concurrently with disable_ddl_transaction! so writes keep flowing. If a concurrent build fails, drop the leftover invalid index before retrying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is PostgreSQL not using my index?
&lt;/h3&gt;

&lt;p&gt;The planner skips an index when it estimates a sequential scan is cheaper, which is common on small tables or when a query matches a large share of rows. Stale statistics, or conditions that don’t match the index’s leading column or partial-index predicate, can also cause it. Run ANALYZE, then check the plan with EXPLAIN ANALYZE.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can too many indexes slow down a Rails application?
&lt;/h3&gt;

&lt;p&gt;Yes. Every index must be updated on each insert, update, and delete, so unused indexes add write latency, storage, and VACUUM work without speeding up reads. Review pg_stat_user_indexes periodically and drop indexes with an idx_scan count of zero, after confirming they don’t back a unique constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Database indexing is one of the highest-impact optimizations you can make in a Rails application. But the goal isn’t to add indexes everywhere—it’s to create the &lt;strong&gt;right indexes for the queries your application actually executes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In conclusion, by combining thoughtful indexing, query analysis, and zero-downtime deployment techniques, you can build Rails applications that continue to perform well as your data grows from thousands to millions of records.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/rails-database-indexing/" rel="noopener noreferrer"&gt;Database Indexing in Ruby on Rails: When, Why, and How&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>activerecord</category>
      <category>databaseindexing</category>
      <category>databaseperformance</category>
    </item>
    <item>
      <title>Beyond the Chatbot: What the New Digital Coworkers Actually Do, and What They Cost</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Thu, 03 Sep 2026 14:42:03 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/beyond-the-chatbot-what-the-new-digital-coworkers-actually-do-and-what-they-cost-35b3</link>
      <guid>https://dev.to/bluetickconsultants_inc/beyond-the-chatbot-what-the-new-digital-coworkers-actually-do-and-what-they-cost-35b3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Published:&lt;/strong&gt; 3&lt;time&gt; September 2026&lt;/time&gt; | &lt;strong&gt;Updated:&lt;/strong&gt; 3&lt;time&gt; September&lt;/time&gt;&lt;time&gt; 2026&lt;/time&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; Agentic AI digital coworkers can now operate software that offers no other way in, by looking at the screen and clicking. Two credible products launched in August 2026 – Grok Bot from xAI and Warmwind OS from Warmwind AG. Agentic AI cost is unpredictable by design: Warmwind was listed at 1 euro per worker hour, Grok Bot has no standalone price and bills overflow by the token. Reliability is the harder problem. At 85 percent accuracy per step, a ten-step job finishes cleanly about one time in five. Gartner expects over 40 percent of agentic AI projects to be cancelled by the end of 2027. Use these tools for short, bounded jobs with a checkable result – not long unattended chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;You asked an AI chatbot to help you with your expense claims. It wrote you a lovely set of instructions. Then you went and did all the clicking yourself.&lt;/p&gt;

&lt;p&gt;That is the shape of the complaint. The assistant is clever, and it is also sitting on its hands. It can tell you what to do, draft the email, explain the spreadsheet formula. It cannot open your accounting software, find last month’s invoices, and file them. So the boring part, the part that eats the afternoon, still lands on you.&lt;/p&gt;

&lt;p&gt;The gap has a simple cause. Most AI tools are built to answer, then stop. Every step needs you to come back and ask again. If a job has thirty steps, you are the one carrying it between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are solving
&lt;/h2&gt;

&lt;p&gt;A new kind of product tries to close that gap. Instead of answering and stopping, it gets its own computer in the cloud and works on the job in the background.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It has a screen, a keyboard and a mouse, just like you do, plus its own web browser and file storage.&lt;/li&gt;
&lt;li&gt;You give it a whole task, not a single question. Something like: pull last week’s orders, check them against the invoices, and flag the mismatches.&lt;/li&gt;
&lt;li&gt;It keeps going while your laptop is shut. The work happens on a machine in a data centre, not on your desk.&lt;/li&gt;
&lt;li&gt;It comes back to you when it needs a decision, a password, or permission to send something.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The industry calls these &lt;a href="https://www.bluetickconsultants.com/claude-cowork-a-practical-step-toward-ai-agents-inside-everyday-work/" rel="noopener noreferrer"&gt;agents, digital coworkers, or cloud employees&lt;/a&gt;. The plain version: software that does the clicking instead of describing it.&lt;/p&gt;

&lt;p&gt;Two things this does not solve, and they matter more than the marketing suggests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It does not remove the need to check the work. Someone still reviews what came out, especially for anything involving money or customers.&lt;/li&gt;
&lt;li&gt;It does not make a messy process tidy. If your current workflow only works because a human quietly fixes things, handing it to an agent hands over the mess too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A real example
&lt;/h2&gt;

&lt;p&gt;Two products launched within a fortnight of each other in August 2026, and they take noticeably different routes to the same idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok Bot, from xAI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.unite.ai/xai-launches-grok-bot-always-on-ai-teammates-with-their-own-cloud-computers/" rel="noopener noreferrer"&gt;Launched in beta on 11 August 2026&lt;/a&gt;, then widened across subscription plans through the rest of the month.&lt;/li&gt;
&lt;li&gt;Each user gets one persistent cloud computer with a browser, a filesystem and a terminal. Your bots share it.&lt;/li&gt;
&lt;li&gt;It prefers a proper connection to an app where one exists, and falls back to driving the screen only for tools that offer no clean way in. This matters: it is a hybrid, not a pure screen-driver.&lt;/li&gt;
&lt;li&gt;You can show it a job once by recording a browser session of up to ten minutes, and it saves that as a routine it can repeat on a schedule.&lt;/li&gt;
&lt;li&gt;It runs on macOS, Windows and iPhone. &lt;a href="https://www.digitalapplied.com/blog/grok-bot-ai-teammates-launch-cloud-computer-2026" rel="noopener noreferrer"&gt;There is no Linux, Android or iPad version at launch&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Warmwind OS, from Warmwind AG in Jena, Germany
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://techsifted.com/posts/warmwind-os-launch-august-2026/" rel="noopener noreferrer"&gt;Version 1.0 launched publicly on 26 August 2026&lt;/a&gt;, after a closed beta with a waitlist reported at over 12,000 people.&lt;/li&gt;
&lt;li&gt;This one is the pure screen-driver. Each worker gets a Linux desktop in the cloud and &lt;a href="https://www.bgr.com/tech/the-worlds-first-ai-operating-system-wants-to-automate-your-workflow/" rel="noopener noreferrer"&gt;operates ordinary software by looking at the screen and using a mouse and keyboard. No integrations required&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;That is the whole pitch: it can drive old, ugly business software that has no modern way to connect to it. The launch video demonstrates exactly that, on legacy German rental-management software.&lt;/li&gt;
&lt;li&gt;The company runs on German cloud infrastructure and leans hard on European data-protection rules as a selling point, which matters to firms that cannot send recordings of their screens to an American provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both companies use the phrase visual navigation. Only Warmwind, however, means it literally for everything. Judge each on which of your tools it can actually reach, because that is where the difference shows up.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works, and the maths that decides whether it helps
&lt;/h2&gt;

&lt;p&gt;The mechanics are less interesting than the arithmetic. An agent working through a long job has to get every step right in a row. As a result, small error rates compound fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  How reliable is a multi-step AI agent?
&lt;/h3&gt;

&lt;p&gt;Here is the calculation. It is short enough to read and you can run it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;How often does a multi-step agent finish a whole job correctly?&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;end_to_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Chance all steps succeed in a row, as a percentage.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;step_accuracy&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;steps_before_coinflip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_accuracy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;How many steps until the job is likelier to fail than succeed.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nf"&gt;end_to_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;


&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Agent is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; accurate on each single step:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;end_to_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; steps -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;5.1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;% finish clean&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; coin flip at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;steps_before_coinflip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; steps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running it prints this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent is 85% accurate on each single step:
   5 steps -&amp;gt; 44.4% finish clean
  10 steps -&amp;gt; 19.7% finish clean
  20 steps -&amp;gt; 3.9% finish clean
  50 steps -&amp;gt; 0.0% finish clean
  coin flip at 5 steps

Agent is 95% accurate on each single step:
   5 steps -&amp;gt; 77.4% finish clean
  10 steps -&amp;gt; 59.9% finish clean
  20 steps -&amp;gt; 35.8% finish clean
  50 steps -&amp;gt; 7.7% finish clean
  coin flip at 14 steps

Agent is 99% accurate on each single step:
   5 steps -&amp;gt; 95.1% finish clean
  10 steps -&amp;gt; 90.4% finish clean
  20 steps -&amp;gt; 81.8% finish clean
  50 steps -&amp;gt; 60.5% finish clean
  coin flip at 69 steps

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What those numbers mean in practice
&lt;/h3&gt;

&lt;p&gt;In plain words, for anyone who skipped the code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An agent that gets 85 out of 100 individual clicks right finishes a ten-step job cleanly about one time in five.&lt;/li&gt;
&lt;li&gt;Push it to 95 out of 100 and the same ten-step job works about six times in ten. Better, still not something you would leave unwatched.&lt;/li&gt;
&lt;li&gt;You need roughly 99 out of 100 before long jobs hold together, and even then a fifty-step job fails about four times in ten.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.bluetickconsultants.com/tokenmaxxing-to-real-roi-agentic-ai-beyond-engineering/" rel="noopener noreferrer"&gt;This is why the demos look magical and the rollouts disappoint&lt;/a&gt;. A demo is a short job. Your actual work is a long one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also tells you how to use these tools well. Short, bounded jobs with a checkable result are where they pay off. Long unattended chains, by contrast, are where they quietly burn money.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;Prices below were checked on 2 September 2026. This corner of the market is repricing constantly, so treat these as a starting point and confirm before you buy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Option&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Upfront cost&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ongoing cost&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Hidden costs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Carry on as you are&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None in cash&lt;/td&gt;
&lt;td&gt;The hours themselves. Work that only one person knows how to do.&lt;/td&gt;
&lt;td&gt;Anyone whose repetitive work is under a few hours a week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok Bot (xAI)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;No standalone plan. Bundled into SuperGrok Plus and Heavy, and Cursor Pro Plus, Ultra and Teams tiers. Plans include a weekly allowance.&lt;/td&gt;
&lt;td&gt;Usage past the allowance is billed from model and token cost. Grok 4.6 runs $2 per million input tokens and $6 per million output, doubling above 200k tokens. Reports say there is no product-specific spend cap yet.&lt;/td&gt;
&lt;td&gt;Individuals already paying for one of those plans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warmwind OS&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Listed at 1 euro per hour of worker time when checked on 27 August 2026, with a launch promotion at half price.&lt;/td&gt;
&lt;td&gt;Idle time still counts as worker time. Screen-driven runs are slower than direct connections, so the same job burns more minutes.&lt;/td&gt;
&lt;td&gt;Smaller firms with old software and European data rules to satisfy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traditional RPA (UiPath and similar)&lt;/td&gt;
&lt;td&gt;Consultant setup, often weeks&lt;/td&gt;
&lt;td&gt;Per-licence, quoted by sales&lt;/td&gt;
&lt;td&gt;Breaks whenever a screen layout changes. Needs someone on staff to maintain it.&lt;/td&gt;
&lt;td&gt;Large, stable, high-volume processes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things to take from the table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nobody publishes a number you can plan against. Warmwind gives an hourly rate but the hours depend on how slow the screen work is. Grok Bot gives no separate price at all, only an allowance inside a bundle.&lt;/li&gt;
&lt;li&gt;Hourly and token billing means the bill scales with how badly the agent struggles. A job that goes wrong twice costs three times as much as one that works.&lt;/li&gt;
&lt;li&gt;Even so, free trials do not tell you the running cost. The published guidance is to treat the first month as an experiment, not a budget line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pros and cons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What genuinely works
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reaches software that has no other way in. This is the real advance. Old systems that no integration ever supported can now be driven.&lt;/li&gt;
&lt;li&gt;Setup is also quick. No consultant, no integration project. You describe the job or record yourself doing it once.&lt;/li&gt;
&lt;li&gt;Work continues without you. Overnight jobs finish while your machine is off.&lt;/li&gt;
&lt;li&gt;Teaching by demonstration is far easier than writing rules, and it is how both products expect you to start.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What genuinely does not
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reliability compounds badly, as the numbers above show. This is the central limitation and no vendor has solved it.&lt;/li&gt;
&lt;li&gt;Screen-watching is also fragile by nature. A redesigned page, a pop-up, a slow load, or an unexpected login prompt can derail a run that worked yesterday.&lt;/li&gt;
&lt;li&gt;Costs are hard to predict and, in at least one case, hard to cap.&lt;/li&gt;
&lt;li&gt;Weak isolation between agents. &lt;a href="https://www.techtimes.com/articles/324176/20260812/grok-bot-launches-any-app-no-api-all-bots-share-one-cloud-computer-every-login.htm" rel="noopener noreferrer"&gt;xAI’s own documentation states the cloud computer belongs to your account rather than to each bot&lt;/a&gt;, and warns explicitly against using separate bots as a security boundary. Logins and files are shared across all of them.&lt;/li&gt;
&lt;li&gt;The analyst forecasts point the other way from the hype. &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" rel="noopener noreferrer"&gt;Gartner expects more than 40 percent of agentic AI projects to be cancelled by the end of 2027&lt;/a&gt;, citing runaway costs, unclear value and weak risk controls. Surveys through 2026 repeatedly found most pilots never reaching production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On that last point, one correction to a claim you will see everywhere. 2027 is being sold as the year these tools take over. The evidence available today points instead to 2027 being the year the weaker projects get cancelled. Both things can be true: the technology is real and improving, and most attempts to deploy it will still fail. Pick your jobs accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;These tools are genuinely new in one respect: they can operate software that offers no other way in, by looking at the screen and clicking.&lt;/li&gt;
&lt;li&gt;Two credible products launched in August 2026. Warmwind OS drives the screen for everything. Grok Bot prefers a direct connection and only drives the screen when it must.&lt;/li&gt;
&lt;li&gt;Reliability compounds. At 85 percent per step, a ten-step job finishes cleanly about one time in five. Short, checkable jobs are where these tools earn their keep.&lt;/li&gt;
&lt;li&gt;Costs are unpredictable by design. Warmwind was listed at 1 euro per worker hour in late August 2026. Grok Bot has no standalone price and bills overflow usage by the token.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.bluetickconsultants.com/how-to-build-secure-agentic-ai-apps-a-complete-technical-guide/" rel="noopener noreferrer"&gt;Nobody has solved supervision&lt;/a&gt;. Budget for someone to check the output, and do not point an agent at anything expensive without an approval step.&lt;/li&gt;
&lt;li&gt;Gartner expects over 40 percent of agentic AI projects to be cancelled by the end of 2027. &lt;a href="https://www.bluetickconsultants.com/free-ai-opportunity-audit/" rel="noopener noreferrer"&gt;Start with one small job you can verify, not a department-wide rollout&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is an agentic AI digital coworker?
&lt;/h3&gt;

&lt;p&gt;It is software that gets its own computer in the cloud, with a browser, filesystem and&lt;br&gt;&lt;br&gt;
screen, and completes a whole multi-step task rather than answering a single question. It works&lt;br&gt;&lt;br&gt;
in the background while your own machine is off, and returns to you when it needs a decision, a&lt;br&gt;&lt;br&gt;
password or permission to send something.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much does agentic AI cost in 2026?
&lt;/h3&gt;

&lt;p&gt;Neither major product publishes a number you can plan against. Warmwind OS was listed at 1&lt;br&gt;&lt;br&gt;
euro per hour of worker time when checked on 27 August 2026, with a launch promotion at half&lt;br&gt;&lt;br&gt;
price. Grok Bot has no standalone plan at all; it is bundled into SuperGrok Plus and Heavy and&lt;br&gt;&lt;br&gt;
Cursor Pro tiers with a weekly allowance, and overflow usage is billed at Grok 4.6 token rates&lt;br&gt;&lt;br&gt;
of 2 dollars per million input tokens and 6 dollars per million output. Because billing is&lt;br&gt;&lt;br&gt;
hourly or per token, the bill scales with how badly the agent struggles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do agentic AI agents fail on long tasks?
&lt;/h3&gt;

&lt;p&gt;Accuracy compounds across steps. An agent that is 85 percent accurate on each individual step&lt;br&gt;&lt;br&gt;
finishes a ten-step job cleanly only about one time in five, and reaches a coin flip at five&lt;br&gt;&lt;br&gt;
steps. At 95 percent accuracy a ten-step job works about six times in ten. You need roughly 99&lt;br&gt;&lt;br&gt;
percent per step before long jobs hold together, and even then a fifty-step job fails about four&lt;br&gt;&lt;br&gt;
times in ten. This is why demos, which are short jobs, look magical while real rollouts&lt;br&gt;&lt;br&gt;
disappoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should we choose Grok Bot or Warmwind OS?
&lt;/h3&gt;

&lt;p&gt;Judge each on which of your tools it can actually reach. Grok Bot is a hybrid: it prefers a&lt;br&gt;&lt;br&gt;
proper connection to an app where one exists and drives the screen only as a fallback, and it&lt;br&gt;&lt;br&gt;
runs on macOS, Windows and iPhone with no Linux, Android or iPad version at launch. Warmwind OS&lt;br&gt;&lt;br&gt;
is a pure screen-driver on a cloud Linux desktop, needs no integrations, and is the stronger fit&lt;br&gt;&lt;br&gt;
for old business software and for firms bound by European data-protection rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is 2027 the year agentic AI takes over?
&lt;/h3&gt;

&lt;p&gt;The evidence available today points the other way. Gartner expects more than 40 percent of&lt;br&gt;&lt;br&gt;
agentic AI projects to be cancelled by the end of 2027, citing runaway costs, unclear value and&lt;br&gt;&lt;br&gt;
weak risk controls. Both things can be true at once: the technology is real and improving, and&lt;br&gt;&lt;br&gt;
most attempts to deploy it will still fail. Start with one small job you can verify rather than&lt;br&gt;&lt;br&gt;
a department-wide rollout.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does agentic AI not solve?
&lt;/h3&gt;

&lt;p&gt;Two things. It does not remove the need to check the work, especially where money or&lt;br&gt;&lt;br&gt;
customers are involved, so budget for a human reviewer and an approval step. And it does not&lt;br&gt;&lt;br&gt;
make a messy process tidy: if a workflow only works because a person quietly fixes things,&lt;br&gt;&lt;br&gt;
handing it to an agent hands over the mess too.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/agentic-ai-cost-reliability/" rel="noopener noreferrer"&gt;Beyond the Chatbot: What the New Digital Coworkers Actually Do, and What They Cost&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>agenticai</category>
      <category>aiagents</category>
      <category>aiimplementationcost</category>
      <category>computeruseagents</category>
    </item>
    <item>
      <title>AI-native SDLC in a regulated, multi-vendor delivery estate</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Wed, 26 Aug 2026 19:10:05 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/ai-native-sdlc-in-a-regulated-multi-vendor-delivery-estate-1ki6</link>
      <guid>https://dev.to/bluetickconsultants_inc/ai-native-sdlc-in-a-regulated-multi-vendor-delivery-estate-1ki6</guid>
      <description>&lt;p&gt;Published: &lt;time&gt;26 August 2026&lt;/time&gt; | Updated: &lt;time&gt;27 August 2026&lt;/time&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR –&lt;/strong&gt;  The short answer: the artifact chain is the right spine, and the playbook just starts one stage too late and assumes one company owns the whole chain. Two things break when you run an &lt;strong&gt;AI-native SDLC in BFSI&lt;/strong&gt;. Intent doesn’t arrive clean: work enters through eight different doors and one tech lead is already translating it in his head, so that translation has to become a committed artifact before Plan. And no single company owns the chain – it crosses an MSA at every SI boundary, which makes constraint-store access a legal question, not an engineering one. Underneath both sits the part nobody funds: four shared stores that already half-exist in your estate. Build those first. Build implementation last.&lt;/p&gt;

&lt;p&gt;Written for CIOs, delivery heads and tech leads at banks, insurers and NBFCs running agentic delivery across a captive team and multiple systems integrators. Use this when you are scoping an agentic SDLC programme, deciding what to build before the pilot, or renegotiating partner contracts to cover agent access. It covers intake and triage design, shared context stores, approval gates in regulated change processes, and vendor and MSA boundaries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; put out an &lt;a href="https://claude.com/blog/the-ai-native-sdlc-playbook" rel="noopener noreferrer"&gt;AI-native SDLC playbook&lt;/a&gt; a few weeks ago. The core idea is the good part: every stage ends by writing an artifact to version control and the next stage begins by reading it, so the chain of commits becomes the audit trail. Who asked for what, what the agent produced and who approved it.&lt;/p&gt;

&lt;p&gt;That is a genuinely clean idea. &lt;a href="https://www.bluetickconsultants.com/bfsi/" rel="noopener noreferrer"&gt;If you work in a bank&lt;/a&gt;, you already know why it matters, because you have spent months of your life reconstructing exactly that chain for somebody holding a printout.&lt;/p&gt;

&lt;p&gt;So this is not a rebuttal. It is the two things I kept writing in the margin, both of which come from &lt;a href="https://www.bluetickconsultants.com/agentic-ai-is-changing-finance-what-cfos-should-do-now/" rel="noopener noreferrer"&gt;doing this work in Indian BFSI&lt;/a&gt;, where the shape of the problem is different.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first assumption: intent arrives clean
&lt;/h2&gt;

&lt;p&gt;The playbook starts at Plan, where a person has an idea, brainstorms with &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude&lt;/a&gt; and &lt;a href="https://www.bluetickconsultants.com/spec-engineering-replaces-prompt-engineering/" rel="noopener noreferrer"&gt;produces a proto-spec saved as intent.md&lt;/a&gt;, which the product owner reviews and corrects before committing.&lt;/p&gt;

&lt;p&gt;Lovely. Now go look at your actual queue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxjhr6ifsovfs2b8b441x.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxjhr6ifsovfs2b8b441x.webp" alt="Eight intake sources - email, alerts, Jira, ServiceNow, VAPT and more - converging on one tech lead who normalises them" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At a lender we work with, work enters through eight different doors. Change requests from business as a paragraph in an email. &lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt; firing on a p99 threshold. &lt;a href="https://www.atlassian.com/software/jira" rel="noopener noreferrer"&gt;Jira&lt;/a&gt; tickets that say “not working” with a screenshot attached. &lt;a href="https://www.servicenow.com" rel="noopener noreferrer"&gt;ServiceNow&lt;/a&gt; escalations that started as a customer complaint and got translated twice on the way up from L1. Product asks sized by somebody who has never opened the repo. A partner ringing to say their integration broke. Sixty items from the last VAPT sorted by CVSS. And a &lt;a href="https://www.atlassian.com/software/confluence" rel="noopener noreferrer"&gt;Confluence&lt;/a&gt; page from a retro nine months ago that everyone agrees is important.&lt;/p&gt;

&lt;p&gt;Eight formats. Eight ideas of what urgent means. Eight different stakeholders and only one of them is a product owner sitting down to write an intent.md.&lt;/p&gt;

&lt;p&gt;Somebody is already translating all of that. Usually a tech lead or BA, in his head, between calls. One of them showed me a spreadsheet he’d been keeping privately for eleven months because his memory had stopped coping. Four tabs, one per source, colour coded. He was slightly embarrassed about it. He shouldn’t have been, it was the best documentation in that organisation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwws63f656oq60pbmbyw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwws63f656oq60pbmbyw.webp" alt="Artifact chain from intake.md through intent.md, spec.md, plan.md, diff and PR, with intake.md added at the front" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That translation step has to become a stage. Not a person. In our framing it’s stage zero, sitting before Plan and it produces the same kind of committed artifact the playbook describes, just with more fields because the input is messier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Origin and the raiser’s exact words&lt;/li&gt;
&lt;li&gt;Classification, including where an item is genuinely two things&lt;/li&gt;
&lt;li&gt;Impact surface: services, modules, owners, downstream consumers&lt;/li&gt;
&lt;li&gt;Precedent from past similar work, with actuals against estimates&lt;/li&gt;
&lt;li&gt;The constraint set that applies to these paths&lt;/li&gt;
&lt;li&gt;Duplication check against the open backlog&lt;/li&gt;
&lt;li&gt;Blast radius and who finds out first&lt;/li&gt;
&lt;li&gt;Open questions, with names against them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The precedent field is the one everybody drops in a working group, because populating it means querying delivery history nobody has cleaned. It’s also the one that fixes your estimates. Fight for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second assumption: one company owns the chain
&lt;/h2&gt;

&lt;p&gt;This is the bigger one for anyone reading this in Mumbai.&lt;/p&gt;

&lt;p&gt;The playbook’s chain works beautifully inside a single engineering organisation. A private bank or an insurer does not have one. You have a captive team, &lt;a href="https://www.bluetickconsultants.com/on-demand-ai-delivery-pods/" rel="noopener noreferrer"&gt;two or three SIs sitting on different towers&lt;/a&gt; and product vendors for the core systems who will not let you touch anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpgdcft5oo909g8cxvdx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpgdcft5oo909g8cxvdx.webp" alt="Commit chain split across a captive team, two SI partners and a core product vendor, with context lost at each MSA seam" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the commit chain has a seam in it. Several, actually. Three things follow and I have not seen any of them written down anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The artifact matters most exactly where it crosses the MSA.&lt;/strong&gt; Handover between your captive team and a partner is where context currently evaporates and gets rebuilt in a KT call that nobody records. If you build your intake layer only inside the captive team, you have fixed the smaller half.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing your constraint store is a legal question, not an engineering one.&lt;/strong&gt; The convention and constraint store is what stops an agent, yours or a partner’s, from quietly bypassing an audit wrapper. Which means partner access. Which means an amendment, procurement and a conversation with legal that will take five months. I know it will take five months because that is where one of ours currently sits. Start it now, not after the pilot works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bluetickconsultants.com/tokenmaxxing-to-real-roi-agentic-ai-beyond-engineering/" rel="noopener noreferrer"&gt;Nobody has decided who owns the productivity gain&lt;/a&gt; ** and your contract is silent.** On T&amp;amp;M, agent-assisted delivery cuts billed hours, so your partner has no reason to bring it up. On fixed price it accrues to them unless you reopen the SOW. We have seen this handled sensibly with outcome-linked pricing on new work. We have also seen it stall completely because nobody wanted to be the one to reopen a contract.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;_Ask your partners what their agents are reading from your repositories today. _&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The thing underneath all of it
&lt;/h2&gt;

&lt;p&gt;This one is a mistake we made ourselves.&lt;/p&gt;

&lt;p&gt;We spent most of last year starting these engagements at the build stage. It’s the interesting part, it demos well and it’s what clients ring you about. It kept falling over in production and it took me embarrassingly long to work out why: &lt;a href="https://www.bluetickconsultants.com/why-95-of-enterprise-ai-pilot-projects-fail-says-tcs-ceo/" rel="noopener noreferrer"&gt;the pilots were being fed hand-curated work items&lt;/a&gt; by a tech lead who wanted them to succeed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8a30rzl5k6axary4eba.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8a30rzl5k6axary4eba.webp" alt="Six agents from six squads each separately working out which services a change touches, with no shared answer recorded" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then at another client I watched &lt;a href="https://www.bluetickconsultants.com/why-ai-agent-teams-need-organizational-structures-like-human-companies/" rel="noopener noreferrer"&gt;six agents, built by six different squads&lt;/a&gt;, all doing decent work. Five of them were separately figuring out which services a change touched. One queried the CMDB, two parsed the repo directly and one just asked a model to guess from the ticket text. None of them wrote the answer anywhere the others could see it.&lt;/p&gt;

&lt;p&gt;The agents were fine. There was nothing underneath them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsjjbx6c94dprm491rjxd.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsjjbx6c94dprm491rjxd.webp" alt="Four shared stores - service and ownership graph, conventions and constraints, delivery history, decisions and ADRs" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four shared stores fix this and every one of them already half-exists in your estate. Making them queryable is most of the actual work.&lt;/p&gt;

&lt;p&gt;The constraint store is the one that earns its keep in a regulated shop. &lt;a href="https://www.bluetickconsultants.com/how-to-build-secure-agentic-ai-apps-a-complete-technical-guide/" rel="noopener noreferrer"&gt;Which write paths must be audit-logged&lt;/a&gt;. Which fields carry DPDP obligations. Which services sit inside payment data localisation scope. Put it in the repository, versioned with the code. Anything living outside the merge process is stale within two quarters and a stale constraint is worse than an absent one because people trust it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the human signatures go
&lt;/h2&gt;

&lt;p&gt;The playbook is careful about this and I agree with where it lands. Separation of duties holds because the agent that wrote the code has no way to approve it and approval comes from a human through branch protection. Their hooks-as-gates approach is the right mechanism.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1x2ajxtug7mja9w76pue.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1x2ajxtug7mja9w76pue.webp" alt="Four approval points that survive scrutiny: sprint entry, approach before code, the merge, the production release" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My only addition is a subtraction. Most BFSI change processes carry gates that exist because something went wrong in 2019 and nobody since has had the standing to remove them. They cost calendar time and they train everybody to approve without reading, which is the opposite of a control. Four signatures survive real scrutiny. Audit yours against those four and take the rest out.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you’re the one funding this
&lt;/h2&gt;

&lt;p&gt;The first takes a fortnight to get. Ask your tech leads to log the time they spend working out what a work item actually is before it can be assigned. In teams we’ve measured it runs between a fifth and a third of the week for the two or three people carrying most of it. That is a real cost, paid out of your most expensive engineering time and it appears in no report anywhere. It is also the strongest slide you will have.&lt;/p&gt;

&lt;p&gt;The second is audit evidence assembly. Whatever your team currently spends pulling change evidence together for an inspection, that number moves almost immediately once release verification is automated and it is the one your board will feel directly.&lt;/p&gt;

&lt;p&gt;What you should refuse to promise is throughput per engineer. It is what you will be asked for. It moves last, it moves least reliably and committing to it in quarter one is how these programmes die in month nine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I don’t have a good answer to
&lt;/h2&gt;

&lt;p&gt;Juniors. The work that used to teach somebody how a core system fits together, the small tickets and tracing a bug across four services at eleven at night, is exactly what a clean intake layer removes. Somebody handed a complete work item learns less than somebody who had to go and find out. Every EM I talk to has noticed. The only remedy I can think of is deliberately withholding context from people, which nobody actually does and I don’t know what it does to your bench in three years.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, honestly
&lt;/h2&gt;

&lt;p&gt;Read the playbook. It’s better than most things published on this and the artifact chain is the right spine. Then before you build any of it, go and count your doors; and go and find out who is doing the translating today. In our experience, that person exists –  has a spreadsheet and hasn’t told anyone about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is an AI-native SDLC?
&lt;/h3&gt;

&lt;p&gt;In short, an AI-native SDLC is a software development lifecycle where every stage ends by committing a machine-readable artifact to version control, and the next stage begins by reading it. The chain of commits becomes the audit trail: who asked for what, what the agent produced, and who approved it. It replaces linear hand-offs between roles with a loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why doesn’t the AI-native SDLC playbook work as written in BFSI?
&lt;/h3&gt;

&lt;p&gt;The short answer is that it rests on two assumptions that don’t hold in a bank. The first is that intent arrives clean from a product owner, when in practice work enters through eight or more channels in eight different formats. The second is that one engineering organisation owns the whole commit chain, when a private bank or insurer has a captive team, multiple systems integrators and core product vendors – so the chain has a seam at every contract boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is stage zero in an AI-native SDLC?
&lt;/h3&gt;

&lt;p&gt;Stage zero is an intake and triage stage that sits before Plan. It turns messy inbound work – emails, monitoring alerts, tickets, escalations, VAPT findings – into one normalised, committed artifact. The step already exists in most estates, but as a person doing it in their head between calls rather than as a file anyone can read. Making it a stage is what makes everything downstream reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should an intake artifact contain?
&lt;/h3&gt;

&lt;p&gt;Eight fields: the origin and the raiser’s exact words; classification, including where an item is genuinely two things; the impact surface across services, modules, owners and downstream consumers; precedent from past similar work with actuals against estimates; the constraint set applying to those paths; a duplication check against the open backlog; blast radius and who finds out first; and open questions with names against them.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you run an AI-native SDLC across multiple vendors?
&lt;/h3&gt;

&lt;p&gt;In short: start with the contract, not the tooling. The artifact matters most where it crosses the MSA, so giving a partner access to your constraint store needs an amendment, procurement and legal – budget months, and start before the pilot succeeds rather than after. Separately, decide who owns the productivity gain: on time and materials it cuts your partner’s billed hours, and on fixed price it accrues to them unless you reopen the SOW.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which human approvals should survive in an AI-native SDLC?
&lt;/h3&gt;

&lt;p&gt;The short answer is four. What enters the sprint, signed by the delivery or engineering manager; the approach before any code is written, signed by the tech lead; the merge, signed by a peer reviewer; and the production release, signed by the release manager or CAB. Most other gates in a regulated change process exist because something went wrong years ago. They cost calendar time and train people to approve without reading, which is the opposite of a control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who should own an AI-native SDLC programme in a bank?
&lt;/h3&gt;

&lt;p&gt;In most estates it sits with the CIO or delivery head, executed by the tech leads who already carry the translation work. Use this guidance when you are scoping an agentic SDLC programme, deciding what to build before a pilot, or renegotiating partner contracts to cover agent access. It applies to banks, insurers and NBFCs running delivery across a captive team and multiple systems integrators, and it covers intake and triage design, shared context stores, approval gates and MSA boundaries.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/ai-native-sdlc-bfsi-multi-vendor-delivery/" rel="noopener noreferrer"&gt;AI-native SDLC in a regulated, multi-vendor delivery estate&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>agenticai</category>
      <category>aigovernance</category>
      <category>aiintegration</category>
      <category>ainativesdlc</category>
    </item>
    <item>
      <title>AI Defenders Assemble: OpenAI Daybreak Red and Blue Land on AWS Bedrock</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:25:13 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/ai-defenders-assemble-openai-daybreak-red-and-blue-land-on-aws-bedrock-59l</link>
      <guid>https://dev.to/bluetickconsultants_inc/ai-defenders-assemble-openai-daybreak-red-and-blue-land-on-aws-bedrock-59l</guid>
      <description>&lt;p&gt;&lt;strong&gt;Published:&lt;/strong&gt; &lt;time&gt;August 21, 2026&lt;/time&gt; |  &lt;strong&gt;Last Updated:&lt;/strong&gt; &lt;time&gt;August 21, 2026&lt;/time&gt;&lt;/p&gt;

&lt;p&gt;Key Takeaway: OpenAI Daybreak Red and Blue are now available on Amazon Bedrock for eligible enterprise customers. In summary, Daybreak Blue (GPT-5.6 Sol) is purpose-built for defensive security workflows including incident response and vulnerability discovery, while Daybreak Red&lt;br&gt;&lt;br&gt;
(GPT-5.6 Cyber) is purpose-trained for authorized vulnerability research and exploit validation. Bottom line: Importantly, both models run with zero-operator access enforced at the chip level – OpenAI never receives your data and never used for model training.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS and OpenAI have officially joined forces to revolutionize enterprise cyber defense by launching OpenAI’s specialized Daybreak models on ** &lt;a href="https://www.bluetickconsultants.com/microsoft-foundry-vs-amazon-bedrock-2026/" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; **.&lt;/strong&gt; This launch introduces two tailored access tiers: &lt;a href="https://openai.com/index/daybreak-models-are-now-available-on-aws/" rel="noopener noreferrer"&gt;Daybreak Blue&lt;/a&gt;&lt;strong&gt;(GPT-5.6 Sol)&lt;/strong&gt; and &lt;strong&gt;Daybreak Red (GPT-5.6 Cyber)&lt;/strong&gt;. Both are available to eligible customers in the US East (Ohio) region and built to accelerate threat detection, &lt;a href="https://www.bluetickconsultants.com/ai-and-ml-solutions/" rel="noopener noreferrer"&gt;incident response&lt;/a&gt;, and authorized vulnerability research inside a hardware-isolated environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Faces of Daybreak: Blue vs. Red
&lt;/h2&gt;

&lt;p&gt;Standard commercial AI models often refuse legitimate dual-use security tasks due to strict safety guardrails. Daybreak addresses this directly, providing vetted defenders with calibrated intelligence tiers matched to their operational needs.&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;Feature&lt;/strong&gt; | &lt;strong&gt;Daybreak Blue (GPT-5.6 Sol)&lt;/strong&gt; | &lt;strong&gt;Daybreak Red (GPT-5.6 Cyber)&lt;/strong&gt; |&lt;br&gt;
| &lt;strong&gt;Primary Focus&lt;/strong&gt; | General-purpose defensive workflows | Advanced vulnerability research &amp;amp; exploit validation |&lt;br&gt;
| &lt;strong&gt;Refusal Threshold&lt;/strong&gt; | Standard defensive calibration | Lowered for authorized deep technical tasks |&lt;br&gt;
| &lt;strong&gt;Core Use Cases&lt;/strong&gt; | Incident response, patching, discovery | Exploit reproduction, red teaming |&lt;br&gt;
| &lt;strong&gt;Enterprise Governance&lt;/strong&gt; | OpenAI Daybreak Access Program | Separately approved specialist path + extra verification |&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Example 1: Streamlining Incident Response with Daybreak Blue
&lt;/h2&gt;

&lt;p&gt;Consider a mid-sized financial enterprise facing a potential security breach. The Security Operations Center (SOC) team detects a sudden anomaly: an internal server is communicating with an unknown external IP address using an unusual, obfuscated PowerShell script.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Log Analysis:&lt;/strong&gt; First, the analyst feeds the raw, obfuscated PowerShell script and the relevant endpoint telemetry logs into an &lt;a href="https://www.bluetickconsultants.com/tokenmaxxing-to-real-roi-agentic-ai-beyond-engineering/" rel="noopener noreferrer"&gt;automated pipeline&lt;/a&gt; powered by Daybreak Blue via Amazon Bedrock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;De-obfuscation &amp;amp; Triage:&lt;/strong&gt; Next, utilizing GPT-5.6 Sol, the model instantly de-obfuscates the code, mapping the script’s behavior directly to the &lt;a href="https://attack.mitre.org/" rel="noopener noreferrer"&gt;MITRE ATT&amp;amp;CK framework&lt;/a&gt; (e.g., identifying it as a Living off the Land attack technique).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remediation Loop:&lt;/strong&gt; Finally, Daybreak Blue drafts a localized firewall rule to block the malicious external IP, generates an &lt;a href="https://www.bluetickconsultants.com/implementing-anthropics-model-context-protocol-mcp-for-ai-applications-and-agents/" rel="noopener noreferrer"&gt;AWS IAM policy&lt;/a&gt; amendment to restrict the compromised server’s permissions, and writes a draft incident summary for the leadership team.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; As a result, what typically takes an incident responder hours of manual reverse engineering happens in under two minutes, stopping lateral movement before it starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Example 2: Validating a Zero-Day Patch with Daybreak Red
&lt;/h2&gt;

&lt;p&gt;Consider this: an enterprise software provider receives a private disclosure about a critical remote code execution (RCE) vulnerability in their main application. Before they can ship a patch, they must reproduce the exploit to ensure their fix actually blocks it. Standard LLMs would completely refuse to help create or validate an exploit payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Exploit Reproduction:&lt;/strong&gt; An authorized security researcher uses Daybreak Red (GPT-5.6 Cyber). Daybreak Red features a lower refusal threshold for trusted partners.
The model analyzes the raw crash dump and generates a proof-of-concept
(PoC) exploit payload to confirm the vulnerability’s impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Remediation:&lt;/strong&gt; The developers write a patch to sanitize the vulnerable input fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation Testing:&lt;/strong&gt; Subsequently, the researcher feeds the new patch back to Daybreak Red and asks it to modify the exploit payload to try and bypass the new defenses. The model tests the code aggressively, completing the legitimate dual-use task successfully and confirming that the patch entirely neutralizes the vulnerability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Notably, according to early performance benchmarks, GPT-5.6 Cyber successfully completes &lt;strong&gt;95% of legitimate dual-use security tasks&lt;/strong&gt; , compared to a mere 1.5–2% success rate from standard, heavily restricted models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood: AWS Enclaves and Hardware-Enforced Privacy
&lt;/h2&gt;

&lt;p&gt;Deploying these models through Amazon Bedrock addresses the primary concern of enterprise security leaders: &lt;strong&gt;data privacy&lt;/strong&gt;. The architecture is engineered around absolute isolation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Operator Access:&lt;/strong&gt; Specifically, the models run on AWS next-generation inference engines with hardware-enforced isolation at the silicon chip level via AWS Nitro Enclaves. Specifically, no human operator—not even an AWS engineer—can view your active session data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Training on Enterprise Data:&lt;/strong&gt; Furthermore, your prompts, internal logs, proprietary code, and sensitive vulnerability findings stay within your private AWS environment. Moreover, data is never shared with OpenAI and OpenAI never uses it to train future models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Data Retention:&lt;/strong&gt; Eligible enterprises can actively request a strict zero-data-retention policy for absolute operational compliance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Strategic Impact: Shifting from Reactive to Predictive Defense
&lt;/h2&gt;

&lt;p&gt;Overall, the arrival of Daybreak on Amazon Bedrock marks a fundamental shift in how modern enterprises manage risk. By transitioning away from brittle, signature-based detection systems, organizations unlock major strategic advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eliminating the Cyber Skills Gap:&lt;/strong&gt; Tier-1 and Tier-2 SOC analysts can use Daybreak Blue to handle complex reverse engineering and log correlation tasks, acting as a massive force multiplier for understaffed teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Red Teaming:&lt;/strong&gt; Annual external audits are no longer sufficient. With Daybreak Red,
internal researchers can run continuous, automated exploit simulations to
evaluate real-time architectural resilience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drastically Reduced Blast Radii:&lt;/strong&gt; Consequently, automating the chain from discovery to patch mitigation delivers measurable results. Enterprises can shrink their Mean Time to Remediation
(MTTR) from days to single-digit minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Would you like me to tailor this expanded post further? I can:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add a technical section with &lt;strong&gt;actual sample prompts&lt;/strong&gt; used for Daybreak Blue and Red.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Boto3 Python code snippet&lt;/strong&gt; showing how to invoke these models via the Bedrock API.&lt;/li&gt;
&lt;li&gt;Generate a custom &lt;strong&gt;visual image prompt&lt;/strong&gt; for your blog’s cover graphic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security teams can apply for &lt;a href="https://openai.com/form/enterprise-trusted-access-for-cyber/" rel="noopener noreferrer"&gt;enrollment in Daybreak access&lt;/a&gt; directly through OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is OpenAI Daybreak and how does it differ from standard AI models?
&lt;/h3&gt;

&lt;p&gt;In short, OpenAI Daybreak is a cyber defense initiative that gives vetted security professionals governed access to frontier AI models. Unlike standard commercial AI models that refuse legitimate dual-use security tasks due to strict safety guardrails, Daybreak provides calibrated access tiers – Blue for defensive workflows and Red for advanced vulnerability research – matched with strong identity verification and access controls.&lt;/p&gt;




&lt;h3&gt;
  
  
  What is the difference between Daybreak Blue and Daybreak Red?
&lt;/h3&gt;

&lt;p&gt;Specifically, Daybreak Blue provides access to GPT-5.6 Sol with safeguards calibrated for defensive security work such as incident response, vulnerability discovery, and detection engineering. Daybreak Red provides access to GPT-5.6 Cyber, a purpose-trained cybersecurity model with a lower refusal threshold designed for authorized tasks such as exploit reproduction, red teaming, and zero-day patch validation. Daybreak Red requires a separately approved specialist path with additional verification.&lt;/p&gt;




&lt;h3&gt;
  
  
  How do I get access to Daybreak Red and Blue on Amazon Bedrock?
&lt;/h3&gt;

&lt;p&gt;To get started, access requires enrollment in OpenAI’s Trusted Access for Cyber program. Once approved by OpenAI, you work with your AWS account team to request model access on Bedrock. The models are currently available to eligible customers in the US East (Ohio) region.&lt;/p&gt;




&lt;h3&gt;
  
  
  Is enterprise data safe when using Daybreak models on Amazon Bedrock?
&lt;/h3&gt;

&lt;p&gt;Yes. To be clear, both models run on Bedrock’s next-generation inference engine with zero-operator access enforced at the chip level, meaning no AWS engineer or operator can view your active session data. Your prompts, internal logs, and vulnerability findings OpenAI never accesses your findings and are never used to train future models. Additionally, eligible enterprises can also request a zero-data-retention policy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Can Daybreak Red be used to create malicious exploits?
&lt;/h3&gt;

&lt;p&gt;No. Access to Daybreak Red requires passing through OpenAI’s Trusted Access for Cyber identity and trust framework, which includes identity verification, account security monitoring, approved-use restrictions, and legal attestations. Starting September 1, 2026, all individual Daybreak accounts must also adopt hardware security keys. In other words, the lower refusal threshold is specifically calibrated for authorized defensive research, not offensive use.&lt;/p&gt;




&lt;h3&gt;
  
  
  How does Daybreak Blue help SOC teams with incident response?
&lt;/h3&gt;

&lt;p&gt;Daybreak Blue can de-obfuscate malicious scripts, map attacker behavior to the MITRE ATT&amp;amp;CK framework, draft firewall rules to block malicious IPs, generate IAM policy amendments, and produce incident summaries — tasks that typically take hours of manual analysis can be completed in under two minutes, acting as a force multiplier for understaffed security teams.&lt;/p&gt;




&lt;h3&gt;
  
  
  What performance benchmarks has GPT-5.6 Cyber demonstrated?
&lt;/h3&gt;

&lt;p&gt;According to OpenAI’s early performance benchmarks, Notably, GPT-5.6 Cyber successfully completes 95% of legitimate dual-use security tasks, compared to a 1.5–2% success rate from standard heavily restricted models.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/openai-daybreak-red-blue-amazon-bedrock-enterprise-cybersecurity/" rel="noopener noreferrer"&gt;AI Defenders Assemble: OpenAI Daybreak Red and Blue Land on AWS Bedrock&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloudaiinfrastructur</category>
      <category>agenticai</category>
      <category>aiintegration</category>
      <category>amazonbedrock</category>
    </item>
    <item>
      <title>The Nuances of Payment Orchestration: Apple Pay, Google Pay, and 3DS</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Wed, 12 Aug 2026 10:38:29 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/the-nuances-of-payment-orchestration-apple-pay-google-pay-and-3ds-5b7j</link>
      <guid>https://dev.to/bluetickconsultants_inc/the-nuances-of-payment-orchestration-apple-pay-google-pay-and-3ds-5b7j</guid>
      <description>&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Payment orchestration looks simple on a slide: one API, many processors, smart routing, higher auth rates. In production, the hard parts are the methods that sit&lt;/strong&gt;  &lt;strong&gt;&lt;em&gt;outside&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;a plain card-not-present charge – wallets and authentication challenges. Apple Pay, Google Pay, and ** &lt;a href="https://www.emvco.com/emv-technologies/3-d-secure/" rel="noopener noreferrer"&gt;3-D Secure&lt;/a&gt;&lt;/strong&gt; (3DS) do not behave like “just another payment method” on your PSP. They change token formats, liability, UX, retry logic, and what your orchestrator is allowed to decide.**&lt;/p&gt;

&lt;p&gt;This post covers the nuances that matter when you design or operate an orchestration layer around those three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this guide is for
&lt;/h2&gt;

&lt;p&gt;This guide is written for &lt;strong&gt;payment engineers, fintech platform teams, e-commerce architects, and engineering leaders&lt;/strong&gt; who are building or operating a multi-processor payment orchestration layer.&lt;/p&gt;

&lt;p&gt;It is most useful when you are designing or improving payment flows that involve &lt;strong&gt;Apple Pay, Google Pay, and 3-D Secure (3DS / SCA)&lt;/strong&gt;, and when you need clear answers to these decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a failed wallet or 3DS attempt be safely retried on another processor?&lt;/li&gt;
&lt;li&gt;When should you step-up authentication instead of hopping to a different PSP?&lt;/li&gt;
&lt;li&gt;How should token formats, liability shift, and attempt state be modelled so routing rules do not create hard declines?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Primary use cases this guide supports:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing multi-PSP payment orchestration&lt;/li&gt;
&lt;li&gt;Handling Apple Pay and Google Pay token routing&lt;/li&gt;
&lt;li&gt;Managing 3DS / SCA authentication and retries&lt;/li&gt;
&lt;li&gt;Reducing hard declines caused by incorrect wallet or 3DS failover logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Industries:&lt;/strong&gt; E-commerce, marketplaces, fintech platforms, and any business accepting cards + digital wallets under SCA or high-fraud environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  What orchestration actually owns
&lt;/h2&gt;

&lt;p&gt;A payment orchestrator sits between your checkout and one or more processors (Stripe, Adyen, Worldpay, local acquirers, etc.). Typical jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Method abstraction&lt;/strong&gt; – present cards, wallets, and local methods through one merchant integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing&lt;/strong&gt; – pick a processor by cost, auth rate, geo, MID health, or method support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failover&lt;/strong&gt; – soft-decline retry on another processor without asking the shopper to re-enter details&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.bluetickconsultants.com/automating-sales-cycle-with-custom-erp-fintech/" rel="noopener noreferrer"&gt;Reconciliation &amp;amp; reporting&lt;/a&gt; – normalize statuses, fees, and dispute signals&lt;/li&gt;
&lt;li&gt;Wallets and 3DS strain every one of those jobs. The orchestrator often cannot freely re-route a completed Apple Pay cryptogram or a finished 3DS challenge the way it can re-attempt a raw PAN authorization (and even PAN retries have network and SCA limits).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; treat wallets and 3DS as &lt;em&gt;stateful authentication + authorization contracts&lt;/em&gt;, not interchangeable rails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apple Pay: cryptograms, domains, and processor binding
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What you actually receive
&lt;/h3&gt;

&lt;p&gt;Apple Pay does not give you a reusable PAN you can freely shop around. You get a &lt;strong&gt;payment token&lt;/strong&gt; (DPAN / device account number style credentials) plus a &lt;strong&gt;cryptogram&lt;/strong&gt; and transaction metadata. That payload is meant for a specific merchant / processor context.&lt;/p&gt;

&lt;p&gt;Nuances for orchestration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Processor affinity&lt;/strong&gt; – Many setups decrypt or process the Apple Pay token &lt;em&gt;at a specific PSP&lt;/em&gt;. If your orchestrator wants multi-PSP Apple Pay, you usually need either:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;separate merchant identifiers / payment processing certificates per processor, or&lt;/li&gt;
&lt;li&gt;a model where the orchestrator (or a vault partner) is the Apple Pay merchant and routes the resulting network token onward.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developer.apple.com/documentation/applepayontheweb" rel="noopener noreferrer"&gt;Merchant validation&lt;/a&gt; is not optional theater&lt;/strong&gt; – Domain association files, merchant ID registration, and session creation (&lt;code&gt;ApplePaySession&lt;/code&gt;) must match the environment the shopper sees. A misconfigured domain on one brand/subdomain silently kills wallet availability while cards still work – a common “orchestration looks down” false alarm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Button UX is part of conversion&lt;/strong&gt; – Apple requires using their button / sheet patterns. Orchestrators that invent a generic “Wallet” button and then branch to Apple Pay often fail review or confuse users. Method discovery (show Apple Pay only when &lt;code&gt;ApplePaySession.canMakePayments()&lt;/code&gt; / active card checks pass) belongs in the client, not only in backend routing tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Billing / shipping contacts&lt;/strong&gt; – Apple Pay can return contact fields your card form never collected. Orchestration and fraud stacks must accept incomplete address shapes and map them consistently so tax, shipping, and AVS do not disagree across processors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurring and merchant-initiated&lt;/strong&gt; – Apple Pay for subscriptions and MIT flows has extra constraints (and evolving network rules). Do not assume a one-time Apple Pay auth gives you the same MIT flexibility as a card-on-file network token from a processor vault.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Orchestration implication
&lt;/h3&gt;

&lt;p&gt;Failover after an Apple Pay decline is often &lt;strong&gt;not&lt;/strong&gt; “send the same cryptogram to processor B.” Prefer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retry on the &lt;em&gt;same&lt;/em&gt; processor with adjusted parameters (if soft decline), or&lt;/li&gt;
&lt;li&gt;fall back to another method (card form / Google Pay / local APM), or&lt;/li&gt;
&lt;li&gt;re-invoke Apple Pay for a fresh payload if the shopper is still in session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blind cross-PSP replay of wallet payloads is a frequent source of hard declines and support tickets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Pay: two token modes that look alike
&lt;/h2&gt;

&lt;p&gt;Google Pay is easy to underestimate because the UI looks like one button. Under the hood, orchestration behavior splits on &lt;a href="https://developers.google.com/pay/api/web/reference/request-objects" rel="noopener noreferrer"&gt;tokenization specification&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gateway tokens vs. network tokens / direct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PAYMENT_GATEWAY&lt;/strong&gt; – Google returns a token encrypted for a named PSP gateway. Your orchestrator is effectively choosing that PSP &lt;em&gt;before&lt;/em&gt; the sheet completes. Multi-PSP orchestration means multiple gateway configs, or accepting that Google Pay is pinned per attempt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DIRECT&lt;/strong&gt; / network token style setups – You (or your orchestrator) decrypt with your own keys and can, in principle, route more flexibly – at the cost of PCI scope, key management, and certification burden.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nuances:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Allowed payment methods in the request&lt;/strong&gt; – Card networks, auth methods (&lt;code&gt;PAN_ONLY&lt;/code&gt; vs &lt;code&gt;CRYPTOGRAM_3DS&lt;/code&gt;), and billing address requirements change both conversion and risk. PAN_ONLY can behave closer to a card-on-file PAN (and may trigger 3DS / SCA differently than cryptogram-backed tokens).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment &amp;amp; merchant ID&lt;/strong&gt; – Test vs production, merchant origin, and existing method requirements differ by platform (Android app, web, certain browsers). “Works on Chrome Android, missing on Safari desktop” is often configuration, not orchestration routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3DS interaction&lt;/strong&gt; – Cryptogram-backed Google Pay credentials may already carry device-binding signals. Forcing a full 3DS challenge on every Google Pay auth can hurt conversion without buying proportional fraud reduction. Your orchestrator’s risk rules should distinguish wallet cryptogram auths from raw PAN entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Country and processor coverage&lt;/strong&gt; – Google Pay availability and supported networks vary. Orchestration “smart routing” must filter processors by &lt;em&gt;actual&lt;/em&gt; Google Pay support for that MID and region, not by generic card acquiring support.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Orchestration implication
&lt;/h3&gt;

&lt;p&gt;Decide early whether Google Pay is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PSP-pinned&lt;/strong&gt; (simpler, common): orchestrator selects PSP → client requests Google Pay for that gateway → authorize on that PSP only, or&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;orchestrator-decrypted&lt;/strong&gt; (flexible, heavier): orchestrator owns keys / compliance → can route the resulting credentials with clearer rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mixing both models without documenting the attempt state machine creates impossible retries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is 3DS the same as authorization?
&lt;/h2&gt;

&lt;p&gt;3DS proves who the shopper is; it does not authorize the charge. Attaching the authentication result to the authorization correctly is what preserves liability shift and avoids issuer declines.&lt;/p&gt;

&lt;p&gt;3-D Secure (especially &lt;strong&gt;EMV 3DS / 3DS2&lt;/strong&gt; ) is an authentication protocol between merchant/requestor, directory server, and issuer ACS. Orchestration teams often collapse it into “extra redirect that reduces chargebacks.” The nuances are sharper.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frictionless vs challenge
&lt;/h3&gt;

&lt;p&gt;Issuers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frictionless&lt;/strong&gt; – authenticate based on risk data with no shopper UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenge&lt;/strong&gt; – OTP, banking app, biometrics, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your orchestrator must preserve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication path (&lt;code&gt;transStatus&lt;/code&gt; values like Y / A / N / U / R / C, depending on version and mapping)&lt;/li&gt;
&lt;li&gt;ECI / CAVV (or AVV) / dsTransID / threeDSServerTransID&lt;/li&gt;
&lt;li&gt;version (2.1.0 vs 2.2.0 matters for data and exemptions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authorization without correctly attaching authentication data is how you lose liability shift &lt;em&gt;and&lt;/em&gt; get issuer declines.&lt;/p&gt;

&lt;h3&gt;
  
  
  SCA, exemptions, and TRA
&lt;/h3&gt;

&lt;p&gt;In regulated regions (notably &lt;a href="https://eba.europa.eu/publications-and-media/press-releases/eba-clarifies-application-strong-customer-authentication" rel="noopener noreferrer"&gt;PSD2 SCA&lt;/a&gt; in Europe), 3DS is entangled with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Low-value exemptions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transaction Risk Analysis (TRA)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trusted beneficiaries (allowlisting)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIT / recurring&lt;/strong&gt; out-of-scope or one-leg-out cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An orchestrator that always “does 3DS” or never does can both be wrong. Optimal policy is usually:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Risk engine proposes challenge / frictionless / exemption&lt;/li&gt;
&lt;li&gt;Processor / 3DS server executes&lt;/li&gt;
&lt;li&gt;Auth result feeds authorization&lt;/li&gt;
&lt;li&gt;Soft declines like “soft decline – authenticate” (&lt;code&gt;soft decline&lt;/code&gt; / &lt;code&gt;1Z&lt;/code&gt; style issuer guidance, processor-specific codes) trigger a &lt;strong&gt;step-up&lt;/strong&gt; , not a blind processor hop&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Cross-processor 3DS
&lt;/h3&gt;

&lt;p&gt;This is the sharp edge of orchestration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 3DS authentication completed with Processor A’s 3DS server is generally &lt;strong&gt;not portable&lt;/strong&gt; to Processor B’s authorization.&lt;/li&gt;
&lt;li&gt;Re-routing after challenge completion usually means &lt;strong&gt;re-authenticating&lt;/strong&gt; , which means more friction and possible shopper drop-off.&lt;/li&gt;
&lt;li&gt;Some vault / network token strategies reduce pain for retries, but they do not magically make ACS results universal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Design for attempt-scoped authentication:&lt;/strong&gt; bind &lt;code&gt;attempt_id → processor → 3DS result → auth&lt;/code&gt;. Failover rules should know whether a new 3DS is required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data quality decides frictionless rates
&lt;/h3&gt;

&lt;p&gt;3DS2 expects a rich browser and, where applicable, app SDK data (accept headers, viewport, IP, device channels, etc.). Orchestrators that proxy checkout through multiple frontends or WebViews often strip fields and accidentally force challenges. Measure &lt;strong&gt;challenge rate&lt;/strong&gt; and &lt;strong&gt;frictionless rate&lt;/strong&gt; per channel, not only overall auth rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the three collide in one checkout
&lt;/h2&gt;

&lt;p&gt;Real checkouts combine these paths:&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;Shopper path&lt;/strong&gt; | &lt;strong&gt;Authn signal&lt;/strong&gt; | &lt;strong&gt;Orchestration constraint&lt;/strong&gt; |&lt;br&gt;
| Card + 3DS challenge | CAVV / ECI from ACS | Sticky to 3DS-performing processor for that attempt |&lt;br&gt;
| Apple Pay | Device cryptogram | Often sticky to Apple Pay merchant/PSP config |&lt;br&gt;
| Google Pay (gateway) | Gateway-encrypted token | Sticky to chosen gateway PSP |&lt;br&gt;
| Google Pay (PAN_ONLY) | May still need 3DS / SCA | Treat closer to card + possible step-up |&lt;br&gt;
| Card exemption / TRA | Possibly no challenge | Document exemption; monitor dispute liability |&lt;/p&gt;

&lt;h3&gt;
  
  
  Liability shift is not binary marketing copy
&lt;/h3&gt;

&lt;p&gt;Liability shift depends on method, region, network, authentication result, and merchant category. Apple Pay / Google Pay cryptogram transactions and successful 3DS can each shift liability under conditions – but &lt;a href="https://www.bluetickconsultants.com/bfsi/" rel="noopener noreferrer"&gt;fraud tools&lt;/a&gt;, friendlier fraud, and certain MCCs still leave residual risk. Orchestration reporting should separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticated vs not&lt;/li&gt;
&lt;li&gt;wallet vs PAN&lt;/li&gt;
&lt;li&gt;challenged vs frictionless&lt;/li&gt;
&lt;li&gt;exemption claimed vs authenticated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise finance and risk argue from different truths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical design principles for orchestrators
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model payment method as a state machine&lt;/strong&gt; , not a string enum. States like &lt;code&gt;WalletSessionCreated&lt;/code&gt;, &lt;code&gt;TokenReceived&lt;/code&gt;, &lt;code&gt;ThreeDSMethodUrl&lt;/code&gt;, &lt;code&gt;Challenged&lt;/code&gt;, &lt;code&gt;Authenticated&lt;/code&gt;, &lt;code&gt;Authorized&lt;/code&gt;, &lt;code&gt;SoftDeclinedNeedsStepUp&lt;/code&gt; prevent illegal transitions (e.g., “route elsewhere after challenge”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate method eligibility from processor routing.&lt;/strong&gt; Eligibility: can this shopper use Apple Pay here? Routing: which MID should take this attempt? Google Pay gateway selection often &lt;em&gt;is&lt;/em&gt; routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer step-up over hop&lt;/strong&gt; when the decline reason is authentication-related. Prefer hop when the decline is acquirer/MID health related &lt;em&gt;and&lt;/em&gt; you still have routable credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalize decline taxonomy&lt;/strong&gt; across PSPs – especially soft decline / SCA required / do not honor / lost-stolen. Raw processor codes are not an orchestration policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep client SDKs honest.&lt;/strong&gt; Apple Pay and Google Pay need client-side capability checks; 3DS needs correct browser data and challenge windows (including iframes, pop-ups, and native SDK UI). Backend-only orchestration cannot fix a broken challenge UX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the ugly paths:&lt;/strong&gt; challenge cancel, challenge timeout, Apple Pay sheet dismiss, Google Pay &lt;code&gt;STATUS_CANCELED&lt;/code&gt;, partial address, and “auth success / authz fail.” Those dominate real abandonment more than happy-path auth rates.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What “good” looks like
&lt;/h2&gt;

&lt;p&gt;Teams that handle these nuances well usually share outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wallet and 3DS attempts are &lt;strong&gt;attempt-scoped&lt;/strong&gt; with clear processor binding&lt;/li&gt;
&lt;li&gt;Retries are &lt;strong&gt;reason-aware&lt;/strong&gt; (step-up vs re-route vs new wallet sheet)&lt;/li&gt;
&lt;li&gt;Risk policy treats &lt;strong&gt;cryptogram wallets&lt;/strong&gt; differently from &lt;strong&gt;typed PANs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Product analytics track &lt;strong&gt;sheet open → authorized&lt;/strong&gt; funnels separately from card forms&lt;/li&gt;
&lt;li&gt;Compliance and domain/merchant setup are monitored like uptime, not like one-time onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Payment orchestration creates leverage only when it respects the contracts of the methods it routes. Apple Pay, Google Pay, and 3DS are not edge cases — they are where conversion, liability, and authorization integrity are won or lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading (implementation checklists)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm Apple Pay merchant IDs, domains, and certs per PSP or orchestrator model&lt;/li&gt;
&lt;li&gt;Document Google Pay &lt;code&gt;PAYMENT_GATEWAY&lt;/code&gt; vs &lt;code&gt;DIRECT&lt;/code&gt; choice and retry rules&lt;/li&gt;
&lt;li&gt;Map processor soft-decline codes to step-up 3DS vs failover&lt;/li&gt;
&lt;li&gt;Store and forward 3DS cryptograms/ECI with the matching authorization only&lt;/li&gt;
&lt;li&gt;Alert on spikes in challenge rate, wallet cancel rate, and authz fails after successful authn&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do Apple Pay and Google Pay work across multiple payment processors?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No, not freely.&lt;/strong&gt; Apple Pay and Google Pay credentials are generally bound to the merchant and processor context in which they are requested. An Apple Pay cryptogram or a &lt;code&gt;PAYMENT_GATEWAY&lt;/code&gt;-encrypted Google Pay token is typically intended for a specific PSP.&lt;/p&gt;

&lt;p&gt;Supporting multiple processors usually requires separate merchant IDs, certificates, or gateway configurations for each processor. Alternatively, an orchestrator or vault partner can hold the wallet-merchant role and route the resulting network token onward.&lt;/p&gt;

&lt;p&gt;Because wallet credentials are not interchangeable like raw card details, replaying a completed Apple Pay or Google Pay payload against another processor can result in a hard decline. Payment orchestration should therefore treat wallet attempts as processor-aware and attempt-scoped.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Google Pay always require 3DS?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No, Google Pay does not always require 3DS.&lt;/strong&gt; The requirement depends on the authentication method carried by the Google Pay token, the transaction’s risk profile, and applicable SCA requirements.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;CRYPTOGRAM_3DS&lt;/code&gt; token is device-bound and already carries 3-D Secure authentication signals. Forcing an additional full 3DS challenge in every case can add unnecessary friction and reduce conversion without providing proportional fraud protection.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;PAN_ONLY&lt;/code&gt; token behaves more like a stored card credential and may require 3DS or SCA separately. The payment orchestrator should therefore distinguish between &lt;code&gt;CRYPTOGRAM_3DS&lt;/code&gt; and &lt;code&gt;PAN_ONLY&lt;/code&gt; rather than applying the same 3DS policy to every Google Pay transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does a payment retry succeed on one processor but fail on another after 3DS?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Because a completed 3DS authentication is generally tied to the processor and 3DS server that performed the authentication.&lt;/strong&gt; The authentication result cannot always be transferred directly to another processor’s authorization request.&lt;/p&gt;

&lt;p&gt;For example, if Processor A performs the 3DS challenge and the authorization subsequently fails, sending the same authenticated transaction directly to Processor B may fail because Processor B cannot necessarily use Processor A’s authentication result.&lt;/p&gt;

&lt;p&gt;Re-routing after a completed challenge may therefore require a fresh authentication, which introduces additional friction and potential shopper drop-off.&lt;/p&gt;

&lt;p&gt;The safer approach is to use attempt-scoped payment orchestration: bind the &lt;code&gt;attempt_id&lt;/code&gt; to the processor, 3DS result, and authorization together. Failover rules should understand whether the transaction can be retried directly or requires a new authentication step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does using a digital wallet or 3DS guarantee chargeback protection?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No, using a digital wallet or 3DS does not guarantee chargeback protection.&lt;/strong&gt; Liability shift depends on the payment method, region, card network, authentication result, and merchant category.&lt;/p&gt;

&lt;p&gt;Cryptogram-backed Apple Pay and Google Pay transactions, as well as successfully authenticated 3DS transactions, can provide liability-shift benefits when the applicable conditions are met. However, liability shift is not automatic and does not eliminate all dispute or fraud exposure.&lt;/p&gt;

&lt;p&gt;Friendly fraud, certain merchant category codes, authentication outcomes, and network-specific rules can still result in merchant liability.&lt;/p&gt;

&lt;p&gt;For accurate risk reporting, payment orchestration systems should distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authenticated vs. unauthenticated transactions&lt;/li&gt;
&lt;li&gt;Wallet vs. PAN payments&lt;/li&gt;
&lt;li&gt;Challenged vs. frictionless 3DS&lt;/li&gt;
&lt;li&gt;Exemption-based vs. authenticated transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives risk and finance teams a consistent view of authentication, authorization, and dispute exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need an architecture review of your wallet &amp;amp; 3DS orchestration?
&lt;/h2&gt;

&lt;p&gt;Most teams discover gaps only after hard declines or failed Apple Pay domain validation.&lt;/p&gt;

&lt;p&gt;Book a focused architecture review of your current routing, retry, and authentication state machine.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://www.bluetickconsultants.com/ai-architecture-review/" rel="noopener noreferrer"&gt;Book Architecture Review&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://www.bluetickconsultants.com/contact/" rel="noopener noreferrer"&gt;Contact Us&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/payment-orchestration-apple-pay-google-pay-3ds/" rel="noopener noreferrer"&gt;The Nuances of Payment Orchestration: Apple Pay, Google Pay, and 3DS&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>3dsecure</category>
      <category>applepay</category>
      <category>googlepay</category>
    </item>
    <item>
      <title>Postgres 19 Learned to Speak Graph</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Fri, 07 Aug 2026 00:00:44 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/postgres-19-learned-to-speak-graph-1610</link>
      <guid>https://dev.to/bluetickconsultants_inc/postgres-19-learned-to-speak-graph-1610</guid>
      <description>&lt;h2&gt;
  
  
  SQL/PGQ, and why your relational database was a graph all along
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; PostgreSQL 19 ships SQL/PGQ, letting you query your existing relational tables as a graph – no new database, no data migration. It’s built for backend engineers and DBAs currently writing multi-join queries for fraud detection, permissions, recommendations, or hierarchy traversal. It supports fixed-depth pattern matching today; variable-length paths aren’t supported yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt; Backend engineers, DBAs, and data architects running PostgreSQL who currently write multi-join or recursive-CTE queries to model relationships. &lt;strong&gt;Use this when&lt;/strong&gt; you’re building fraud detection, permission audits, recommendation queries, or hierarchy traversal, and want to know whether SQL/PGQ can replace those queries or an entire second graph database.&lt;/p&gt;

&lt;p&gt;I have spent 7 years moving data between systems. One pattern repeats more than any other.&lt;/p&gt;

&lt;p&gt;A team hits a slow query. They buy a specialised database to fix it. Three years later they are maintaining a pipeline instead of building features.&lt;/p&gt;

&lt;p&gt;Graph databases are the classic case. Someone needs to find “customers who share a device with a customer who charged back.” They write a recursive CTE. It takes 90 seconds. By the end of the quarter there is a Neo4j cluster, a Kafka topic, a schema drift problem, and a new on-call rotation. All to answer a question about data that never left Postgres.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.postgresql.org/docs/19/release-19.html" rel="noopener noreferrer"&gt;PostgreSQL 19 changes this&lt;/a&gt;. &lt;a href="https://www.postgresql.org/about/news/postgresql-19-beta-1-released-3313/" rel="noopener noreferrer"&gt;Beta 1 landed on June 4, 2026&lt;/a&gt;, and it ships &lt;strong&gt;SQL/PGQ&lt;/strong&gt; : SQL Property Graph Queries, standardised as &lt;a href="https://www.iso.org/standard/79473.html" rel="noopener noreferrer"&gt;ISO/IEC 9075-16:2023&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;SQL/PGQ lets you declare a graph over tables you already have. Then you query it with graph syntax. No new storage engine. No extension. No ETL. No second copy of your data.&lt;/p&gt;

&lt;p&gt;It is a bigger deal than the release notes suggest. It also does less than the hype suggests. This post covers both halves.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What actually shipped
&lt;/h2&gt;

&lt;p&gt;The core idea is simple: &lt;a href="https://www.postgresql.org/docs/19/ddl-property-graphs.html" rel="noopener noreferrer"&gt;a property graph is a view&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You are not creating an object that stores anything. You write DDL that says which of your tables are nodes, which are edges, and how they connect. Postgres saves that in the catalog.&lt;/p&gt;

&lt;p&gt;Here is the important part. When you run a graph query, the rewriter turns your pattern into ordinary joins. This happens before the planner ever sees it.&lt;/p&gt;

&lt;p&gt;So everything you already have keeps working:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your indexes work&lt;/li&gt;
&lt;li&gt;Your table statistics work&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EXPLAIN&lt;/code&gt; works&lt;/li&gt;
&lt;li&gt;Parallel query works&lt;/li&gt;
&lt;li&gt;Row-level security works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, it is the same machinery. You just get a new front door.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaring a graph
&lt;/h3&gt;

&lt;p&gt;A graph has two parts. &lt;strong&gt;Vertex tables&lt;/strong&gt; are your nodes. &lt;strong&gt;Edge tables&lt;/strong&gt; are the connections between them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;GRAPH&lt;/span&gt; &lt;span class="n"&gt;social_graph&lt;/span&gt;
  &lt;span class="n"&gt;VERTEX&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;
      &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;joined_at&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
      &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;follows&lt;/span&gt;
      &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;follower_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;followed_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;follows&lt;/span&gt;
      &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;likes&lt;/span&gt;
      &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;liked&lt;/span&gt;
      &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the long form. If your tables already have primary keys and foreign keys, Postgres works most of it out for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;GRAPH&lt;/span&gt; &lt;span class="n"&gt;myshop&lt;/span&gt;
  &lt;span class="n"&gt;VERTEX&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;order_items&lt;/span&gt; &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_orders&lt;/span&gt; &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six lines. A working graph over an existing schema. Zero data moved.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to read the syntax
&lt;/h3&gt;

&lt;p&gt;The arrows look strange at first. They are simpler than they appear.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(a IS person) -[IS follows]-&amp;gt; (b IS person)
    └────┬────┘ └─────┬────┘ └────┬────┘
       a node an edge a node

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four rules cover almost everything:&lt;/p&gt;

&lt;p&gt;| Symbol | Meaning |&lt;br&gt;
| &lt;code&gt;( )&lt;/code&gt; round brackets | a &lt;strong&gt;node&lt;/strong&gt; , one row in a vertex table |&lt;br&gt;
| &lt;code&gt;[]&lt;/code&gt; square brackets | an &lt;strong&gt;edge&lt;/strong&gt; , one row in an edge table |&lt;br&gt;
| &lt;code&gt;-&amp;gt;&lt;/code&gt; arrow | which way you are travelling |&lt;br&gt;
| &lt;code&gt;IS label&lt;/code&gt; | “this must have this label” |&lt;/p&gt;

&lt;p&gt;So the pattern above reads: &lt;strong&gt;a person&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; &lt;strong&gt;, who follows, a person&lt;/strong&gt; &lt;code&gt;b&lt;/code&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two more things to know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The word before&lt;/strong&gt; &lt;code&gt;IS&lt;/code&gt; &lt;strong&gt;is an alias.&lt;/strong&gt; You only need it if you want to use that element later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-[f IS follows]-&amp;gt; named f, so you can read f.created_at in COLUMNS
-[IS follows]-&amp;gt; no name, you just want to filter by the label
-[f]-&amp;gt; any edge at all, named f

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;IS&lt;/code&gt; &lt;strong&gt;matches the label, not the table name.&lt;/strong&gt; In the example above the table is called &lt;code&gt;follows&lt;/code&gt; and its label is also &lt;code&gt;follows&lt;/code&gt;. That is only because Postgres uses the table name as the default label. If you had written &lt;code&gt;LABEL knows&lt;/code&gt;, the pattern would be &lt;code&gt;-[IS knows]-&amp;gt;&lt;/code&gt; even though the table is still &lt;code&gt;follows&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying it
&lt;/h3&gt;

&lt;p&gt;Graph queries go inside &lt;a href="https://www.postgresql.org/docs/19/queries-graph.html" rel="noopener noreferrer"&gt;GRAPH_TABLE&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;GRAPH_TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;social_graph&lt;/span&gt;
  &lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;follows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;COLUMNS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;followed_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;GRAPH_TABLE&lt;/code&gt; takes three things: a graph name, a &lt;code&gt;MATCH&lt;/code&gt; pattern, and a &lt;code&gt;COLUMNS&lt;/code&gt; list. It returns a normal relation.&lt;/p&gt;

&lt;p&gt;That last point matters a lot. Because the result is a normal relation, plain SQL wraps around it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;followed_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;follower_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;GRAPH_TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;social_graph&lt;/span&gt;
  &lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;follows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;COLUMNS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;followed_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;followed_name&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;follower_count&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.bluetickconsultants.com/advanced-sql-window-functions-part-4/" rel="noopener noreferrer"&gt;Aggregates, window functions, CTEs&lt;/a&gt;, joins against non-graph tables. All of it works. This is the single biggest advantage over a bolt-on graph database, and I come back to it later.&lt;/p&gt;

&lt;h3&gt;
  
  
  The full pattern grammar
&lt;/h3&gt;

&lt;p&gt;| Syntax | Meaning |&lt;br&gt;
| &lt;code&gt;(v IS label)&lt;/code&gt; | a node with this label, named v |&lt;br&gt;
| &lt;code&gt;(v IS label WHERE cond)&lt;/code&gt; | same, with a filter |&lt;br&gt;
| &lt;code&gt;-[e IS label]-&amp;gt;&lt;/code&gt; | edge going out |&lt;br&gt;
| &lt;code&gt;&amp;lt;-[e IS label]-&lt;/code&gt; | edge coming in |&lt;br&gt;
| &lt;code&gt;-[e IS label]-&lt;/code&gt; | edge in either direction |&lt;br&gt;
| &lt;code&gt;pattern, pattern&lt;/code&gt; | two patterns at once, sharing names |&lt;/p&gt;

&lt;p&gt;That is the whole language. You can learn it in an afternoon.&lt;/p&gt;
&lt;h3&gt;
  
  
  Managing graphs
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;GRAPH&lt;/span&gt; &lt;span class="n"&gt;social_graph&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="p"&gt;...;&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;GRAPH&lt;/span&gt; &lt;span class="n"&gt;social_graph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;touch&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;tables&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In psql, &lt;code&gt;\dG&lt;/code&gt; lists your graphs. The catalog tables are &lt;a href="https://www.postgresql.org/docs/19/catalogs.html" rel="noopener noreferrer"&gt;pg_propgraph_element&lt;/a&gt;, &lt;code&gt;pg_propgraph_label&lt;/code&gt;, &lt;code&gt;pg_propgraph_property&lt;/code&gt; and &lt;code&gt;pg_propgraph_label_property&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Why graphs matter at all
&lt;/h2&gt;

&lt;p&gt;Here is the thing nobody says plainly. &lt;strong&gt;Relational databases are good at graphs. They are bad at expressing graphs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Take a three-hop question. “Which products were bought by customers who share a payment card with a customer who filed a chargeback?”&lt;/p&gt;

&lt;p&gt;In SQL that is six joins. Three of them are self-joins on the same table with different aliases. You will spend twenty minutes checking that &lt;code&gt;c1&lt;/code&gt;, &lt;code&gt;c2&lt;/code&gt; and &lt;code&gt;c3&lt;/code&gt; are on the right side of each condition.&lt;/p&gt;

&lt;p&gt;As a result, the query ends up correct-ish and unreadable. The next person to touch it rewrites it from scratch, because reading it is harder than rewriting it.&lt;/p&gt;

&lt;p&gt;By contrast, the graph version is one line that looks like the sentence you said out loud.&lt;/p&gt;

&lt;p&gt;Above all, that is the real benefit, and it is a human one. Graph syntax shortens the distance between the question and the query. When your fraud analyst can read the query, the query gets reviewed. When it gets reviewed, it gets fixed.&lt;/p&gt;

&lt;p&gt;There is a second reason, and this one is technical. It is about &lt;strong&gt;join depth&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every hop in a relational traversal is a fresh index lookup. That is O(log n) into a B-tree, plus a heap fetch, plus whatever the planner decided about join order.&lt;/p&gt;

&lt;p&gt;Native graph engines work differently. They use &lt;a href="https://neo4j.com/docs/getting-started/appendix/graphdb-concepts/" rel="noopener noreferrer"&gt;index-free adjacency&lt;/a&gt;: each node physically stores pointers to its neighbours. So each hop is O(degree). A pointer chase, not a search.&lt;/p&gt;

&lt;p&gt;On a billion-edge graph, ten hops deep, that gap is not 2x. It is closer to three orders of magnitude.&lt;/p&gt;

&lt;p&gt;Remember that number. It is the honest boundary of what PG19 can do, and section 5 comes back to it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Where graph shapes show up
&lt;/h3&gt;

&lt;p&gt;Almost everywhere, once you start looking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fraud and AML.&lt;/strong&gt; Shared devices, addresses, cards, IPs. Ring detection is a cycle query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.bluetickconsultants.com/dual-approaches-to-building-knowledge-graphs-traditional-techniques-or-llms/" rel="noopener noreferrer"&gt;Identity resolution&lt;/a&gt;.&lt;/strong&gt; Merging customer records across systems is connected-component finding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions.&lt;/strong&gt; User to group to role to permission to resource is four hops. You probably run it on every request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain.&lt;/strong&gt; A bill of materials is a graph, full stop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendations.&lt;/strong&gt; “Customers who bought X also bought Y” is a two-hop traversal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Org and franchise hierarchies.&lt;/strong&gt; Reporting lines, multi-location networks, ownership chains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data lineage.&lt;/strong&gt; Which dashboards break if I drop this column?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.bluetickconsultants.com/from-rag-to-graphrag-transforming-information-retrieval-with-knowledge-graphs/" rel="noopener noreferrer"&gt;GraphRAG&lt;/a&gt;.&lt;/strong&gt; Retrieval over an entity graph instead of a vector blob. A lot of serious RAG work has moved this way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice how many of these you are already doing. You do them with &lt;a href="https://www.bluetickconsultants.com/advanced-sql-window-functions-part-1/" rel="noopener noreferrer"&gt;recursive CTEs&lt;/a&gt; and hand-written join chains. You have a graph workload. You just called it “the reporting query.”&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Why Postgres, and why now
&lt;/h2&gt;

&lt;p&gt;Three things came together.&lt;/p&gt;
&lt;h3&gt;
  
  
  The standard finally exists
&lt;/h3&gt;

&lt;p&gt;SQL/PGQ became part of ISO SQL in 2023.&lt;/p&gt;

&lt;p&gt;Before that, “graph query language” meant one of three things. Cypher, from Neo4j. Gremlin, from Apache. PGQL, from Oracle. Three dialects, no portability, and an obvious lock-in problem. Most enterprise architects would not sign off on it.&lt;/p&gt;

&lt;p&gt;A standard changes procurement, not just syntax.&lt;/p&gt;
&lt;h3&gt;
  
  
  Postgres keeps absorbing other databases
&lt;/h3&gt;

&lt;p&gt;The last five years have been a slow retreat from using a different database for every job. Look at what Postgres has taken over:&lt;/p&gt;

&lt;p&gt;| It replaced | With |&lt;br&gt;
| Document store | &lt;a href="https://www.bluetickconsultants.com/postgresql/" rel="noopener noreferrer"&gt;JSONB&lt;/a&gt; |&lt;br&gt;
| Search index | &lt;code&gt;tsvector&lt;/code&gt;, &lt;code&gt;pg_trgm&lt;/code&gt; |&lt;br&gt;
| Time-series DB | partitioning, &lt;a href="https://www.bluetickconsultants.com/how-timescaledb-streamlines-time-series-data-for-stock-market-analysis/" rel="noopener noreferrer"&gt;TimescaleDB&lt;/a&gt; |&lt;br&gt;
| Vector DB | &lt;a href="https://github.com/pgvector/pgvector" rel="noopener noreferrer"&gt;pgvector&lt;/a&gt; |&lt;br&gt;
| Job queue | &lt;code&gt;SKIP LOCKED&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;Therefore, graph was the missing piece.&lt;/p&gt;

&lt;p&gt;Every one of those wins happened for the same reason. One copy of the data. One transaction boundary. One backup. One security model. Correctness beats specialisation for the common case, and the common case is most of the market.&lt;/p&gt;
&lt;h3&gt;
  
  
  AI made relationships load-bearing
&lt;/h3&gt;

&lt;p&gt;Vector search finds things that are &lt;em&gt;similar&lt;/em&gt;. It cannot find things that are &lt;em&gt;connected&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;GraphRAG, &lt;a href="https://www.bluetickconsultants.com/tokenmaxxing-to-real-roi-agentic-ai-beyond-engineering/" rel="noopener noreferrer"&gt;agent memory&lt;/a&gt;, entity resolution over LLM-extracted facts. All of it needs traversal. Until now, all of it needed a second database.&lt;/p&gt;
&lt;h3&gt;
  
  
  And one less flattering reason
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;Apache AGE&lt;/a&gt; split the ecosystem, and nobody was happy about it.&lt;/p&gt;

&lt;p&gt;AGE gives you Cypher on Postgres. But it is an extension with its own storage, its own catalog, limited mixing with plain SQL, and a support matrix that lags behind core releases. It works. It just never felt like Postgres.&lt;/p&gt;

&lt;p&gt;In contrast, core SQL/PGQ does feel like Postgres, because it is not a bolt-on. It is the rewriter.&lt;/p&gt;
&lt;h3&gt;
  
  
  How it got built
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://commitfest.postgresql.org/patch/4904/" rel="noopener noreferrer"&gt;Peter Eisentraut&lt;/a&gt; posted the first prototype in February 2024. His own word for it was “fragile.”&lt;/p&gt;

&lt;p&gt;Ashutosh Bapat added &lt;code&gt;WHERE&lt;/code&gt; inside patterns and fixed the memory bugs. Others added cyclic patterns, permissions, RLS support, collation rules, &lt;code&gt;LABELS()&lt;/code&gt; and &lt;code&gt;PROPERTY_NAMES()&lt;/code&gt;, multi-pattern matching and ECPG support.&lt;/p&gt;

&lt;p&gt;Two years. &lt;a href="https://www.depesz.com/2026/07/31/waiting-for-postgresql-19-sql-property-graph-queries-sql-pgq/" rel="noopener noreferrer"&gt;Around 15,000&lt;/a&gt; lines across a hundred-plus files. And a deliberate choice to ship a small correct subset first.&lt;/p&gt;

&lt;p&gt;That is the process you want behind a feature you are going to run a fraud system on.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. A practical example
&lt;/h2&gt;

&lt;p&gt;The most useful graph pattern in production is not a deep traversal. It is the &lt;strong&gt;shared neighbour&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two things are not connected to each other. But both point at the same third thing.&lt;/p&gt;

&lt;p&gt;Once you can see that shape, you find it everywhere. Two accounts on one device. Two customers on one card. Two products in one basket. Two people in one group.&lt;/p&gt;

&lt;p&gt;Here it is on the most generic schema possible. Some entities, the groups they belong to, and a junction table joining them.&lt;/p&gt;

&lt;p&gt;Tables you already have. Nothing about them changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;bigserial&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;organizations&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;bigserial&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;junction&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;didn&lt;/span&gt;&lt;span class="s1"&gt;'t know it.
CREATE TABLE memberships (
  person_id bigint REFERENCES people(id),
  org_id bigint REFERENCES organizations(id),
  role text,
  joined_at timestamptz,
  PRIMARY KEY (person_id, org_id)
);

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the graph. This is the whole migration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;GRAPH&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;
  &lt;span class="n"&gt;VERTEX&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;organizations&lt;/span&gt; &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;organization&lt;/span&gt; &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;memberships&lt;/span&gt;
      &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="n"&gt;organizations&lt;/span&gt;
      &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="n"&gt;PROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;joined_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero rows written. Zero downtime. Reversible with one &lt;code&gt;DROP&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The question: &lt;strong&gt;who else belongs to an organization that Alice belongs to?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;

&lt;p&gt;This is the query you would write today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;memberships&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;person_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;memberships&lt;/span&gt; &lt;span class="n"&gt;m2&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;m2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org_id&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;person_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four joins. Two of them are self-joins on the same table with different aliases.&lt;/p&gt;

&lt;p&gt;It is correct. It is also the kind of query where swapping &lt;code&gt;m1.org_id&lt;/code&gt; and &lt;code&gt;m2.person_id&lt;/code&gt; gives you something that still runs, still returns rows, and is quietly wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;peer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;peer_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;GRAPH_TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;
  &lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;organization&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;COLUMNS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;peer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;peer_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In fact, same plan. Same indexes. Same runtime.&lt;/p&gt;

&lt;p&gt;What changed is that you can now see the answer in the shape of the text. Two arrows meeting at one o. Alice goes out to an organization. Someone else comes back in from it.&lt;/p&gt;

&lt;p&gt;You can check that line for correctness by looking at it. You cannot do that with the four-alias version.&lt;/p&gt;

&lt;h3&gt;
  
  
  It composes
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GRAPH_TABLE&lt;/code&gt; returns an ordinary relation, so plain SQL wraps straight around it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;peer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;shared_orgs&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;GRAPH_TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;
  &lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;organization&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;belongs_to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;COLUMNS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;peer_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;peer_name&lt;/span&gt; &lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;shared_orgs&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That reads: “people who share more than one organization with Alice, most overlap first.”&lt;/p&gt;

&lt;p&gt;A dedicated graph database does not give you that for free. You would pull the rows back to your application and count them there. Here it is a &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The same query, five products
&lt;/h3&gt;

&lt;p&gt;Swap the nouns. The pattern does not change.&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;person&lt;/code&gt; | &lt;code&gt;organization&lt;/code&gt; | and it becomes |&lt;br&gt;
| account | device fingerprint | fraud ring detection |&lt;br&gt;
| customer | payment card | identity resolution |&lt;br&gt;
| product | order | “customers also bought” |&lt;br&gt;
| user | permission group | shared-access audit |&lt;br&gt;
| author | publication | co-authorship network |&lt;/p&gt;

&lt;p&gt;That is why the syntax is worth learning. Not for any one query. For the fact that the query stops being domain plumbing and starts being a shape you recognise.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. The limitations. Read this before you plan anything.
&lt;/h2&gt;

&lt;p&gt;PG19’s implementation is deliberately conservative. What is missing is not an oversight. It is a community choosing to ship a correct subset rather than a shaky superset.&lt;/p&gt;

&lt;p&gt;But you need to know exactly where the wall is.&lt;/p&gt;
&lt;h3&gt;
  
  
  Not supported in PostgreSQL 19
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Variable-length paths.&lt;/strong&gt; You cannot write “one or more hops” or “between two and five hops.”&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Quantified patterns.&lt;/strong&gt; No &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt; or &lt;code&gt;{m,n}&lt;/code&gt; after an edge.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Open-ended traversal.&lt;/strong&gt; No “all paths from A to B, any length.”&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Shortest path.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Transitive closure.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Security-definer graphs.&lt;/strong&gt; Invoker semantics only.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwpv54tbh3qlhywfzxuv.png" alt="❌"&gt; &lt;strong&gt;Graph-native indexes.&lt;/strong&gt; There is no adjacency structure. Only your B-trees.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of these, the first one is the one that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything in PG19 is fixed depth.&lt;/strong&gt; If you cannot write the number of hops as a literal number in the query, PG19 cannot express it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Legal in PG19. Exactly two hops, spelled out.
MATCH (a IS person)-[IS belongs_to]-&amp;gt;(o)&amp;lt;-[IS belongs_to]-(b IS person) NOT legal in PG19. "Two to five hops." MATCH (a IS person)-[IS belongs_to]-&amp;gt;{2,5}(b IS person)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The workaround
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.bluetickconsultants.com/advanced-sql-window-functions-part-1/" rel="noopener noreferrer"&gt;Recursive CTEs still work&lt;/a&gt;, and you should keep them. Given any self-referencing table, say &lt;code&gt;org_units (id, name, parent_id)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Full&lt;/span&gt; &lt;span class="n"&gt;ancestry&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;unknown&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Still&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;right&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PG19&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;RECURSIVE&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;org_units&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Northwest Branch'&lt;/span&gt;
  &lt;span class="k"&gt;UNION&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;org_units&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent_id&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="n"&gt;bound&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;recursion&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The honest performance note
&lt;/h3&gt;

&lt;p&gt;The rewriter produces N joins for an N-hop pattern.&lt;/p&gt;

&lt;p&gt;On the other hand, for two or three hops over indexed foreign keys, Postgres is genuinely competitive with a dedicated graph database. It always was. We just could not say it nicely before.&lt;/p&gt;

&lt;p&gt;However, for deep, unbounded traversal over a large graph, index-free adjacency still wins. No amount of query rewriting closes that gap.&lt;/p&gt;

&lt;p&gt;So do not let the excitement talk you out of Neo4j if you are doing ten-hop pathfinding on a billion edges. That is a real workload, and SQL/PGQ is not the answer to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Converting your relational database to a graph
&lt;/h2&gt;

&lt;p&gt;This is the part people actually need.&lt;/p&gt;

&lt;p&gt;The good news: &lt;strong&gt;you are not converting anything.&lt;/strong&gt; There is no data migration. What you are doing is modelling. You are deciding which of your tables are nouns and which are verbs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The decision procedure
&lt;/h3&gt;

&lt;p&gt;Walk your schema. Put every table into one of four buckets.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bucket A: entity tables become vertex tables
&lt;/h4&gt;

&lt;p&gt;A table is a vertex if a row is a thing that exists on its own. Customers, products, orders, devices, accounts, users, locations.&lt;/p&gt;

&lt;p&gt;The test: could a business person point at a row and name it? Then it is a vertex.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bucket B: pure junction tables become edge tables
&lt;/h4&gt;

&lt;p&gt;These have a composite primary key of exactly two foreign keys and no identity of their own. Things like &lt;code&gt;order_items&lt;/code&gt;, &lt;code&gt;customer_devices&lt;/code&gt;, &lt;code&gt;user_roles&lt;/code&gt;, &lt;code&gt;post_tags&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;They map to edges with no ceremony at all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;order_items&lt;/span&gt; &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="k"&gt;contains&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the junction table carries extra columns, expose them as edge properties. Edges having properties is the whole reason it is called a &lt;em&gt;property&lt;/em&gt; graph.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bucket C: entity tables with inline foreign keys become both
&lt;/h4&gt;

&lt;p&gt;In practice, this is where most schemas live. It is also where most people get stuck.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;orders.customer_id&lt;/code&gt; is a relationship. But there is no junction table to point at.&lt;/p&gt;

&lt;p&gt;The trick: list the table a second time under an alias. Use the foreign key as the source and its own primary key as the destination.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;placed&lt;/span&gt;
    &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;placed&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;orders&lt;/code&gt; is a vertex, because it is a thing with an id and a total and a status. It is &lt;em&gt;also&lt;/em&gt; the source of a &lt;code&gt;placed&lt;/code&gt; edge from customer to order. Same rows, two roles.&lt;/p&gt;

&lt;p&gt;Likewise, a table with three foreign keys becomes three aliased edges.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bucket D: leave it out
&lt;/h4&gt;

&lt;p&gt;Audit logs. &lt;code&gt;schema_migrations&lt;/code&gt;. Denormalised reporting tables. Event streams. Soft-delete tombstones. Translation tables.&lt;/p&gt;

&lt;p&gt;A property graph is a lens, not a mirror. Every table you add is noise in every pattern you write.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model the 20% of your schema that carries the questions you care about.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can define several small graphs instead of one 200-table monster. A &lt;code&gt;fraud_graph&lt;/code&gt;, a &lt;code&gt;catalog_graph&lt;/code&gt;, an &lt;code&gt;authz_graph&lt;/code&gt;. You absolutely should.&lt;/p&gt;

&lt;h3&gt;
  
  
  The awkward cases
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Self-referencing foreign keys&lt;/strong&gt; like &lt;code&gt;parent_id&lt;/code&gt;, &lt;code&gt;manager_id&lt;/code&gt;, &lt;code&gt;replied_to_id&lt;/code&gt;. These are Bucket C. Source and destination are both the same table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;GRAPH&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;
  &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;EDGE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;org_units&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;reports_to&lt;/span&gt;
    &lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;org_units&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;DESTINATION&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;org_units&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;LABEL&lt;/span&gt; &lt;span class="n"&gt;reports_to&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the highest-value conversion in most schemas. It is exactly where your recursive CTEs live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polymorphic associations&lt;/strong&gt; like &lt;code&gt;commentable_type&lt;/code&gt; and &lt;code&gt;commentable_id&lt;/code&gt;. Hello, Rails.&lt;/p&gt;

&lt;p&gt;SQL/PGQ needs a real foreign key target. So split the polymorphic table into one edge definition per concrete type, filtered by a view. Or normalise into explicit join tables.&lt;/p&gt;

&lt;p&gt;Admittedly, this is the one place conversion costs you real work. It is also the one place where the graph model is telling you something true about your schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composite keys&lt;/strong&gt; are supported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SOURCE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters for multi-tenant systems. Do not drop the tenant column out of the key, or you will traverse across tenants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing foreign key constraints&lt;/strong&gt; are common in schemas that grew fast.&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; declare &lt;code&gt;SOURCE KEY ... REFERENCES ...&lt;/code&gt; in the graph where no real constraint exists. Do not do it. Add the real constraints first.&lt;/p&gt;

&lt;p&gt;Graph traversal over unenforced referential integrity will find paths through corrupt data and report them as fact. A fraud alert generated from a dangling foreign key is worse than no alert at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple labels per table&lt;/strong&gt; are allowed. You can model &lt;code&gt;staff&lt;/code&gt; as both &lt;code&gt;person&lt;/code&gt; and &lt;code&gt;employee&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tables that share a label must expose matching properties: same names, same types. Use this for genuine polymorphism. Do not use it to be clever.&lt;/p&gt;

&lt;h3&gt;
  
  
  A conversion checklist
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick one question, not a schema.&lt;/strong&gt; “Detect device-sharing fraud rings” beats “graph-ify the database.” A graph built for one question is small, reviewable, and shippable this week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the missing foreign key constraints&lt;/strong&gt; for the tables in scope. Use &lt;code&gt;NOT VALID&lt;/code&gt; then &lt;code&gt;VALIDATE CONSTRAINT&lt;/code&gt; if the tables are large and busy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index every source and destination key.&lt;/strong&gt; The rewriter produces joins, and joins want indexes. Junction tables usually need the &lt;em&gt;reverse&lt;/em&gt; index too. If &lt;code&gt;(order_id, product_id)&lt;/code&gt; is the primary key, you probably also need &lt;code&gt;(product_id, order_id)&lt;/code&gt;. Traversal goes both ways.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classify your tables&lt;/strong&gt; into A, B, C and D. Write it down before you write any DDL. The modelling argument is the actual work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the **&lt;/strong&gt; &lt;a href="https://www.postgresql.org/docs/19/sql-create-property-graph.html" rel="noopener noreferrer"&gt;CREATE PROPERTY GRAPH&lt;/a&gt;.** It is catalog-only DDL. It takes milliseconds and touches no rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port one query.&lt;/strong&gt; Keep the original. Diff the results with &lt;code&gt;EXCEPT&lt;/code&gt; in both directions. Both should return zero rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run&lt;/strong&gt; &lt;code&gt;EXPLAIN (ANALYZE, BUFFERS)&lt;/code&gt; &lt;strong&gt;on both.&lt;/strong&gt; The plans should be nearly identical. If the graph version is worse, it is almost always a missing index on a traversal key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then expand,&lt;/strong&gt; one question at a time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Importantly, every step is reversible. &lt;code&gt;DROP PROPERTY GRAPH&lt;/code&gt; removes a catalog entry and nothing else.&lt;/p&gt;

&lt;p&gt;This is the lowest-risk “migration” I have ever recommended. It barely deserves the word.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why you should do it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Readability compounds.&lt;/strong&gt; Traversal queries rot fastest. They get copy-pasted, mis-aliased, and never refactored. Making them legible is a lasting maintenance win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You get to delete a system.&lt;/strong&gt; If you run a graph database only for two and three hop questions, you can probably retire it. Along with its CDC pipeline, its lag, and its separate permission model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One transaction boundary.&lt;/strong&gt; Your graph result is consistent with the write that just committed. No replication lag between “the order was placed” and “the fraud graph knows about it.” For fraud and permissions, that is correctness, not convenience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One security model.&lt;/strong&gt; RLS applies. Roles apply. Your auditor does not have to learn a second permission system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is a standard.&lt;/strong&gt; Portable to other engines that implement ISO/IEC 9075-16. &lt;a href="https://docs.oracle.com/en/database/oracle/property-graph/23.1/spgdg/sql-property-graphs.html" rel="noopener noreferrer"&gt;Oracle already does&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trying it costs almost nothing.&lt;/strong&gt; Declaring a property graph cannot make your existing SQL slower. It adds a catalog entry and a syntax option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why you might not
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your traversals are genuinely deep and variable-length. Wait for the feature, or keep the specialised engine.&lt;/li&gt;
&lt;li&gt;You need shortest path, PageRank, community detection or centrality. SQL/PGQ is a query language, not a graph analytics library.&lt;/li&gt;
&lt;li&gt;You are on PG 18 or older and cannot upgrade this year.&lt;/li&gt;
&lt;li&gt;Your team writes three traversal queries a year. Then join syntax is fine, and this is a solution looking for a problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Pros and cons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;p&gt;|   |   |&lt;br&gt;
| No data migration | The graph is a view over existing tables |&lt;br&gt;
| No new infrastructure | Built into core. No extension, no cluster |&lt;br&gt;
| Full SQL composability | CTEs, windows, aggregates, joins with normal tables |&lt;br&gt;
| Existing indexes work | The rewriter emits ordinary joins |&lt;br&gt;
| Transactional consistency | Same MVCC snapshot as your writes |&lt;br&gt;
| Standards-based | ISO/IEC 9075-16:2023 |&lt;br&gt;
| Security built in | Roles and RLS apply unchanged |&lt;br&gt;
| Reversible | &lt;code&gt;DROP PROPERTY GRAPH&lt;/code&gt; costs nothing |&lt;br&gt;
| Readable | Patterns look like the question |&lt;/p&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;p&gt;|   |   |&lt;br&gt;
| No variable-length paths | Fixed hop counts only in PG19 |&lt;br&gt;
| No shortest path or transitive closure | You still need recursive CTEs |&lt;br&gt;
| No index-free adjacency | Deep traversal on huge graphs stays slow |&lt;br&gt;
| No graph algorithms | No PageRank, centrality or community detection |&lt;br&gt;
| No security-definer graphs | Invoker semantics only |&lt;br&gt;
| Read-only | You change the base tables, not the graph |&lt;br&gt;
| PG19 and up only | Realistically a 2026 to 2027 adoption curve |&lt;br&gt;
| Modelling still required | Polymorphic associations need real work |&lt;br&gt;
| Early implementation | Beta. Expect rough edges and plan surprises |&lt;/p&gt;

&lt;h3&gt;
  
  
  Versus the alternatives
&lt;/h3&gt;

&lt;p&gt;|   | SQL/PGQ (PG19) | Apache AGE | Neo4j |&lt;br&gt;
| Language | ISO SQL standard | Cypher (extension) | Cypher |&lt;br&gt;
| Storage | Your existing tables | Extension storage | Native graph |&lt;br&gt;
| Variable-length paths | Not yet | Yes | Yes |&lt;br&gt;
| Graph algorithms | No | Limited | Extensive |&lt;br&gt;
| Deep traversal | Join-bound | Join-bound | Index-free adjacency |&lt;br&gt;
| Installation | Built in | Extension | Separate system |&lt;br&gt;
| Full SQL composability | Yes | Limited | No |&lt;br&gt;
| Data duplication | None | None | Full copy plus sync |&lt;br&gt;
| Operational cost | Zero marginal | Low | High |&lt;/p&gt;

&lt;p&gt;Overall, the pattern is clear. SQL/PGQ wins on integration and loses on depth.&lt;/p&gt;

&lt;p&gt;In short, pick accordingly. And notice that most production “graph” workloads are two or three hops.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Verdict
&lt;/h2&gt;

&lt;p&gt;SQL/PGQ in PostgreSQL 19 is not a graph database. It is something more useful to more people.&lt;/p&gt;

&lt;p&gt;It is an honest admission that your relational schema was already a graph, plus the syntax to say so.&lt;/p&gt;

&lt;p&gt;The limitation everyone will complain about, no variable-length paths, is real and will be fixed. What ships today is the 80% case: bounded traversals over indexed foreign keys, written in a way a human can review.&lt;/p&gt;

&lt;p&gt;If you run a fraud check, a permissions check, a recommendation query or a hierarchy walk, you can adopt this in an afternoon. Keep every index you have. Delete nothing but complexity.&lt;/p&gt;

&lt;p&gt;And the migration story is the best part, because there is not one. You write six lines of DDL against a catalog and your database has a graph in it. If you do not like it, you drop it.&lt;/p&gt;

&lt;p&gt;Seven years of watching teams buy a second database to answer a question about data in their first one. The fix turned out to be a view. That is usually how it goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is PostgreSQL 19 a graph database?
&lt;/h3&gt;

&lt;p&gt;No. SQL/PGQ defines a property graph as a read-only view over your existing&lt;br&gt;&lt;br&gt;
relational tables. There is no graph storage engine, no adjacency structure, and&lt;br&gt;&lt;br&gt;
no data duplication – graph patterns are rewritten into ordinary joins before the&lt;br&gt;&lt;br&gt;
planner ever sees them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to migrate data to use SQL/PGQ?
&lt;/h3&gt;

&lt;p&gt;No. &lt;code&gt;CREATE PROPERTY GRAPH&lt;/code&gt; is catalog-only DDL. It writes zero rows,&lt;br&gt;&lt;br&gt;
takes milliseconds, and &lt;code&gt;DROP PROPERTY GRAPH&lt;/code&gt; removes the catalog entry&lt;br&gt;&lt;br&gt;
without touching your tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does SQL/PGQ support variable-length paths?
&lt;/h3&gt;

&lt;p&gt;Not in PostgreSQL 19. Every pattern is fixed depth – you cannot write quantifiers&lt;br&gt;&lt;br&gt;
like &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt; or &lt;code&gt;{2,5}&lt;/code&gt; after an edge. Shortest&lt;br&gt;&lt;br&gt;
path and transitive closure are also unsupported. Recursive CTEs remain the right&lt;br&gt;&lt;br&gt;
tool for unbounded traversal.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQL/PGQ or Apache AGE – which should I use?
&lt;/h3&gt;

&lt;p&gt;SQL/PGQ is built into core, uses ISO standard syntax, and composes with ordinary&lt;br&gt;&lt;br&gt;
SQL including aggregates and window functions. Apache AGE is an extension with its&lt;br&gt;&lt;br&gt;
own storage and Cypher syntax, but it does support variable-length paths. Choose AGE&lt;br&gt;&lt;br&gt;
if you need unbounded traversal today; choose SQL/PGQ for bounded traversals you want&lt;br&gt;&lt;br&gt;
readable and transactionally consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  When is PostgreSQL 19 released?
&lt;/h3&gt;

&lt;p&gt;Beta 1 was announced on 4 June 2026 and Beta 2 on 16 July 2026. General&lt;br&gt;&lt;br&gt;
availability is scheduled for late 2026. Don’t run SQL/PGQ in production until the&lt;br&gt;&lt;br&gt;
final release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start here.&lt;/strong&gt;  &lt;a href="https://www.bluetickconsultants.com/enterprise-ai-consulting-implementation-services/" rel="noopener noreferrer"&gt;Pick your worst multi-hop join query&lt;/a&gt;. Write it as a &lt;code&gt;GRAPH_TABLE&lt;/code&gt; pattern. Show it to someone who does not write SQL. If they can read it, you have your business case.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/postgresql-19-sql-pgq-graph-queries/" rel="noopener noreferrer"&gt;Postgres 19 Learned to Speak Graph&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>data</category>
      <category>graphdatabases</category>
      <category>knowledgegraphs</category>
    </item>
    <item>
      <title>From “Tokenmaxxing” to Real ROI: How to Move Agentic AI Beyond Engineering</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Fri, 31 Jul 2026 00:00:03 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/from-tokenmaxxing-to-real-roi-how-to-move-agentic-ai-beyond-engineering-3m9l</link>
      <guid>https://dev.to/bluetickconsultants_inc/from-tokenmaxxing-to-real-roi-how-to-move-agentic-ai-beyond-engineering-3m9l</guid>
      <description>&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; 95% of enterprise generative-AI pilots fail to show measurable ROI. Uber closed that gap with “Agentic Pods” – engineer-and-domain-expert pairs on a 10-day sprint – running 16 pods across 16 business functions in two months, with results like a 15-hour finance workflow cut to 30 minutes. This playbook is for CTOs, ops leaders, and finance/HR/support heads who want AI to survive contact with real workflows, not just a pilot deck.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Most enterprises are buying copilot seats and hoping for magic. The companies pulling ahead are doing something harder and far more valuable: rebuilding their actual workflows around AI agents. Here is a practical playbook, plus a detailed look at how Uber put it into practice.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do Most Enterprise AI Pilots Fail?
&lt;/h2&gt;

&lt;p&gt;Most companies approach corporate AI the same way. They buy thousands of generic copilot seats, roll them out across the org, and wait for the productivity curve to bend. A few months later the picture is familiar: a large monthly software bill, marginal gains, and employees who mostly use AI to rewrite their emails.&lt;/p&gt;

&lt;p&gt;The data backs up the disappointment. MIT’s research on enterprise AI found that roughly &lt;a href="https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo/" rel="noopener noreferrer"&gt;95% of corporate generative-AI pilots produced no measurable business impact&lt;/a&gt;. The models are not the weak link. Instead, the problem is that off-the-shelf copilots are built for isolated task completion, while real corporate work is messy, manual, spread across a dozen legacy systems, and almost never documented the way it actually happens. A copilot can help you write a paragraph. It cannot run the seven-system, approval-heavy process your finance team grinds through every Monday.&lt;/p&gt;

&lt;p&gt;Piping every task through an external model API and calling it a strategy has a nickname among engineers: “tokenmaxxing.” It looks like progress on a dashboard. but it rarely shows up in the P&amp;amp;L.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Bottleneck Is Deployment, Not the Model
&lt;/h2&gt;

&lt;p&gt;The AI industry has reached the same conclusion, and it is spending billions to fix it. Between May and July 2026, four of the biggest names in AI (Anthropic, OpenAI, AWS, and Microsoft) committed roughly 9 billion dollars combined to a single idea: embedding their own engineers directly inside customer organizations to make AI work in production. For example, AWS alone put 1 billion dollars into a &lt;a href="https://www.bluetickconsultants.com/the-ctos-guide-to-shipping-ai-in-90-days/" rel="noopener noreferrer"&gt;Forward Deployed Engineering&lt;/a&gt; unit that drops pods of five or six engineers into a customer to build systems in their own environment. &lt;a href="https://www.bluetickconsultants.com/microsoft-foundry-vs-amazon-bedrock-2026/" rel="noopener noreferrer"&gt;Microsoft announced a 2.5 billion dollar division&lt;/a&gt; for the same purpose. Job postings for these “forward deployed engineers” have climbed roughly 800% in a year.&lt;/p&gt;

&lt;p&gt;The common thread is simple: a great model is not a great outcome. Someone has to sit inside the building, learn how the work really gets done, and build the thing that turns a raw capability into a result. You do not have to hire an outside vendor to do this. The most effective version of the model is to build it in-house.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playbook: Agentic Pods
&lt;/h2&gt;

&lt;p&gt;The core structure is a lean, cross-functional squad, call it an &lt;a href="https://www.bluetickconsultants.com/on-demand-ai-delivery-pods/" rel="noopener noreferrer"&gt;Agentic Pod&lt;/a&gt;. Each pod pairs one AI-proficient engineer, someone who already understands your internal systems and data, one-to-one with a domain expert from an operational function like finance, HR, or support. No consultants drawing high-level roadmaps. No off-the-shelf tool the business team is left to adopt on its own. Just a builder and a doer, side by side, redesigning one workflow at a time.&lt;/p&gt;

&lt;p&gt;Two rules make it work. First, use internal engineers, because they already know your APIs, microservices, and data structures, which lets them integrate an agent natively instead of bolting one on. Second, put them next to the people doing the manual labour. That’s because real shortcuts, compliance nuances, and software friction only become visible from the inside.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does the 10-Day Sprint Framework Work?
&lt;/h2&gt;

&lt;p&gt;Give every pod a hard two-week deadline and a repeatable cycle. The deadline is not incidental. It forces the team to ship something real instead of polishing something perfect.&lt;/p&gt;

&lt;p&gt;Days 1-2, Shadow. The engineer sits beside the domain expert, watches every click, tracks the handoffs between systems, and documents the unwritten habits that never make it into a manual.&lt;/p&gt;

&lt;p&gt;Day 3, &lt;a href="https://www.bluetickconsultants.com/ai-consulting-opportunity-design/" rel="noopener noreferrer"&gt;Prioritize&lt;/a&gt;. The pair ranks opportunities by scale, repetition, business impact, and whether the underlying data is actually available.&lt;/p&gt;

&lt;p&gt;Days 4-5, Build. Engineer and expert build a working agent together, so it fits the real tools and steps rather than an idealized version of them.&lt;/p&gt;

&lt;p&gt;Days 6-9, Validate. The agent is tested against several other people doing the same job, to confirm it generalizes across the team and genuinely improves the work.&lt;/p&gt;

&lt;p&gt;Day 10, Ship. The agent goes straight into the production workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Principles for Enterprise AI That Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The workflow is the unit of automation.&lt;/strong&gt; The biggest gains rarely come from automating a single task, like drafting an email. They come from redesigning an entire multi-step workflow around an agent. When an agent owns a process end to end, it naturally removes unnecessary approvals, unifies scattered vendor tools, and cuts legacy friction that no one previously had the authority to fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solve the agent identity problem early.&lt;/strong&gt; More autonomy means more scrutiny of what agents are allowed to do. Before an agent acts on behalf of an employee, your identity and access stack has to be ready for it. Role-based access control, query validation, and clear data attribution are what keep auditing, compliance, and security intact once the agent is the one taking the action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build with your workers, not for them.&lt;/strong&gt; You cannot design an elite agentic system from the outside looking in. The real friction points only surface when a builder sits next to the person doing the job every day. That is exactly why the sprint starts with two full days of shadowing before anyone writes a line of code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A Detailed Example: How Uber Put This Into Practice
&lt;/h2&gt;

&lt;p&gt;The clearest real-world proof of this model comes from Uber.&lt;/p&gt;

&lt;h3&gt;
  
  
  From Engineering to Every Business Function
&lt;/h3&gt;

&lt;p&gt;Uber first saturated AI inside its own engineering org. By CTO Praveen Neppalli Naga’s account, 99% of Uber engineers now use AI tools, more than 70% of pull requests are attributed to local or cloud agents, and engineers have built over 2,500 agent skills across the software development lifecycle. That success raised a sharper question: if AI had already transformed how Uber builds software, what would it take to transform finance, legal, marketing, support, HR, and procurement?&lt;/p&gt;

&lt;p&gt;In response, Uber’s answer was Agentic Pods. It handpicked around 30 of its most AI-proficient engineers and paired each with a domain expert from a business function, giving every pod exactly two weeks and the ten-day sprint described above. &lt;a href="https://x.com/praveenTweets/status/2074605343439810922" rel="noopener noreferrer"&gt;As Naga put it&lt;/a&gt;, you have to understand how the work actually gets done, because process diagrams never capture the copy-paste steps and informal approvals that make up the real thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Results: 16 Pods and Uber’s Finch Finance Agent
&lt;/h3&gt;

&lt;p&gt;In two months, Uber ran 16 Agentic Pods across 16 different business functions. The reported time savings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Business function&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Operational task&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Finance and Treasury&lt;/td&gt;
&lt;td&gt;Capital allocation modeling across 150 global cities&lt;/td&gt;
&lt;td&gt;15 hours&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporate Finance&lt;/td&gt;
&lt;td&gt;Financial pacing and budget runway reports&lt;/td&gt;
&lt;td&gt;2 days&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketing Operations&lt;/td&gt;
&lt;td&gt;Localized web quality assurance&lt;/td&gt;
&lt;td&gt;2 weeks&lt;/td&gt;
&lt;td&gt;50 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer Support&lt;/td&gt;
&lt;td&gt;Building complex routing and support logic&lt;/td&gt;
&lt;td&gt;9,000 manual workflows&lt;/td&gt;
&lt;td&gt;Self-service automation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Take one agent in detail. “&lt;a href="https://www.bluetickconsultants.com/generative-ai-development/" rel="noopener noreferrer"&gt;Finch&lt;/a&gt;” now lives inside Slack for Uber’s finance teams. Instead of writing SQL across multiple platforms, an analyst asks a plain-English question like “What was gross bookings in the US and Canada last quarter?” and gets a governed, permission-checked answer in seconds. Under the hood, Finch uses a supervisor agent that routes each question to specialist sub-agents, orchestration built on &lt;a href="https://langchain-ai.github.io/langgraph/" rel="noopener noreferrer"&gt;LangGraph&lt;/a&gt;, and role-based access control that enforces who can see what. A simplified version of that routing logic looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;user_role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="c1"&gt;# Role-based access control runs before any data is touched
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_access&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;allowed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payroll&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;classify_topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
        &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Access denied for this data domain.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="c1"&gt;# Supervisor routes each question to the right specialist sub-agent
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;supervisor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bookings_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_governed_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gross_bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pacing_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_governed_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;budget_pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FinchState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;access&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_access&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bookings_agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pacing_agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_entry_point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;access&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_conditional_edges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;access&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pacing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;finch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;finch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What was gross bookings in the US and Canada last quarter?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Large result sets export automatically to a linked spreadsheet. Speed never comes at the cost of security or auditability.&lt;/p&gt;

&lt;p&gt;What surprised Uber most was not the speed. It was how quickly engineers dropped into unfamiliar departments started spotting problems that insiders had stopped noticing, opportunities that were, in Naga’s words, hiding in plain sight. Uber is now forming a dedicated team to scale the approach and go deeper, treating workflow redesign as a permanent discipline rather than a one-time experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Word on ROI
&lt;/h2&gt;

&lt;p&gt;However, none of this justifies itself automatically. Uber’s own leadership has been candid that heavy AI investment has not yet produced a proportional wave of new consumer features, and that the cost deserves close scrutiny. Set against MIT’s 95% pilot-failure figure, the lesson is clear. The workflow-first model earns its keep precisely because it ties AI spend to specific, measurable tasks: hours saved on a named report, weeks compressed on a real QA cycle, rather than to a seat count and a hope. If you cannot point to the workflow and the hours it gave back, you are probably still tokenmaxxing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is an Agentic Pod?
&lt;/h3&gt;

&lt;p&gt;An Agentic Pod pairs one AI-proficient engineer with one domain expert from a business function like finance or HR, on a fixed 10-day sprint to build and ship a working AI agent for a real workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do most enterprise AI pilots fail?
&lt;/h3&gt;

&lt;p&gt;MIT’s research found 95% of corporate generative-AI pilots show no measurable business impact, mainly because generic copilots aren’t built for the messy, multi-system workflows that make up real corporate work.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is an Agentic Pod different from a typical AI pilot or consultant engagement?
&lt;/h3&gt;

&lt;p&gt;A typical pilot hands the business a generic tool and hopes it fits. An Agentic Pod embeds an internal engineer directly with the person doing the job for two days of shadowing before any code is written, so the agent is built around the real, undocumented workflow rather than an idealized version of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I start an Agentic Pod without Uber’s resources?
&lt;/h3&gt;

&lt;p&gt;You don’t need 30 engineers or a dedicated team. One AI-fluent engineer, one willing domain expert, a hard two-week deadline, and a single high-friction workflow with existing data is enough to run a first pod and measure the hours it returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;You do not need Uber’s scale to copy this. The ingredients are modest: a few AI-fluent engineers, willing domain experts, a hard deadline, and a rule that you observe the work before you automate it. Start with one or two high-friction workflows where the data already exists, run &lt;a href="https://www.bluetickconsultants.com/free-ai-opportunity-audit/" rel="noopener noreferrer"&gt;a single two-week pod&lt;/a&gt;, and measure the hours it returns.&lt;/p&gt;

&lt;p&gt;The most profitable AI opportunities in your company are probably not sitting in a vendor’s product roadmap. They are hiding in your messiest, most manual, everyday operations. You just have to send your best builders onto the floor to find them.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/tokenmaxxing-to-real-roi-agentic-ai-beyond-engineering/" rel="noopener noreferrer"&gt;From “Tokenmaxxing” to Real ROI: How to Move Agentic AI Beyond Engineering&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>enterpriseai</category>
      <category>agenticai</category>
      <category>aiagents</category>
      <category>airoi</category>
    </item>
    <item>
      <title>Microsoft Foundry vs Amazon Bedrock in 2026: The Model Is No Longer the Decision</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Fri, 24 Jul 2026 11:57:42 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/microsoft-foundry-vs-amazon-bedrock-in-2026-the-model-is-no-longer-the-decision-go5</link>
      <guid>https://dev.to/bluetickconsultants_inc/microsoft-foundry-vs-amazon-bedrock-in-2026-the-model-is-no-longer-the-decision-go5</guid>
      <description>&lt;p&gt;&lt;em&gt;For two years, enterprise AI platform selection had a shortcut. If you needed GPT, you went to Azure. If you needed Claude, you went to AWS. The model catalog made the decision, and the architecture followed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;However, that shortcut is gone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In June 2026, OpenAI revised its exclusive cloud arrangement with Microsoft, and GPT-5.5, GPT-5.4, and Codex reached general availability on Amazon Bedrock. Weeks later, Anthropic’s Claude models reached general availability in &lt;a href="https://www.anthropic.com/news/claude-microsoft-foundry" rel="noopener noreferrer"&gt;Microsoft Foundry&lt;/a&gt;, hosted on Azure. Both frontier families now run on both platforms. The era of choosing a cloud to reach a lab is effectively over.&lt;/p&gt;

&lt;p&gt;This comparison breaks down Microsoft Foundry vs Amazon Bedrock across governance, agent runtime, and cost – the factors that actually decide your platform choice in 2026.&lt;/p&gt;

&lt;p&gt;As a result, this creates an uncomfortable situation for engineering leaders who built their platform strategy on model access. The decision did not disappear. It moved. It now sits in the agent runtime, the governance boundary, and the question of whose legal entity processes your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; Both Claude and GPT now run on Bedrock and Foundry, so model access isn’t the deciding factor anymore. The real differences are in agent runtime, data residency/trust boundary, and cost structure – not which model you can access.&lt;/p&gt;

&lt;h2&gt;
  
  
  A naming note before we start
&lt;/h2&gt;

&lt;p&gt;Azure AI Studio became &lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/" rel="noopener noreferrer"&gt;Azure AI Foundry&lt;/a&gt; in late 2024. Foundry was then rebranded again to Microsoft Foundry. Most practitioners still say “Azure AI Foundry,” Microsoft’s own documentation is inconsistent, and search results for the platform span three names.&lt;/p&gt;

&lt;p&gt;This is a small thing, but it is a real signal. Microsoft’s AI surface has changed names and shapes faster than teams can update their internal architecture documents, and that churn has a cost. We will return to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model breadth: a metric that stopped mattering
&lt;/h2&gt;

&lt;p&gt;The catalog comparison is still worth stating, if only to retire it.&lt;/p&gt;

&lt;p&gt;Microsoft Foundry lists well over 1,900 models in its own documentation, spanning OpenAI, Anthropic, Meta, Mistral, DeepSeek, xAI, Cohere, NVIDIA, and a deep Hugging Face integration. Counts above 10,000 appear in some third-party write-ups, depending on how open-weight variants are tallied.&lt;/p&gt;

&lt;p&gt;Amazon Bedrock is deliberately narrower: roughly 18 providers and somewhere north of 110 individually addressable model variants as of mid-2026, including Amazon’s own Nova family, Anthropic’s Claude line, Meta Llama, Mistral, Cohere, and now OpenAI.&lt;/p&gt;

&lt;p&gt;Here is why that gap matters less than it looks. In practice, nobody evaluates 1,900 models. Teams evaluate three or four, pick one, and then spend eighteen months operating it. A catalog is a procurement convenience, not an engineering advantage. The 1,900 versus 110 comparison flatters Microsoft in a slide deck and tells you almost nothing about what you will actually run in production.&lt;/p&gt;

&lt;p&gt;What does matter: both platforms now carry the frontier models most enterprises shortlist. Claude Fable 5, Anthropic’s most capable widely released model, has been generally available on Amazon Bedrock, Google Cloud, and Microsoft Foundry since June 9, 2026, alongside Claude Opus 4.8, Sonnet 5, and Haiku 4.5. Foundry carries that line next to the GPT-5.x family. Bedrock carries the same Claude line next to GPT-5.5 and GPT-5.4. Pricing on Bedrock for OpenAI models matches OpenAI’s direct rates and draws down existing AWS commitments. Claude usage in Foundry bills through Azure Marketplace and draws down Microsoft Azure Consumption Commitments.&lt;/p&gt;

&lt;p&gt;In short, model access has become table stakes. Commercial plumbing is now the differentiator, and both vendors know it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Claude Available on Both Microsoft Foundry and Amazon Bedrock?
&lt;/h2&gt;

&lt;p&gt;Yes. Anthropic’s Claude models – including Claude Fable 5, Opus 4.8, Sonnet 5, and Haiku 4.5 – are generally available on both Amazon Bedrock and Microsoft Foundry as of mid-2026, alongside Google Cloud. The difference between the two platforms is no longer which models you can access, but how that access is delivered: Claude on Bedrock runs inside your own AWS tenant, while Claude on Foundry is delivered through Anthropic as a third-party marketplace processor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Runtime: Where AWS and Microsoft Really Differ
&lt;/h2&gt;

&lt;p&gt;The biggest difference between AWS and Microsoft is now their agent runtime, and many comparison articles are already outdated.&lt;/p&gt;

&lt;p&gt;Amazon Bedrock has shifted from the original Bedrock Agents to &lt;a href="https://aws.amazon.com/bedrock/agentcore/" rel="noopener noreferrer"&gt;AgentCore&lt;/a&gt;, which is now the recommended platform. AgentCore is modular and framework-agnostic, offering services like Runtime, Gateway, Memory, Identity, and Observability. It works with popular frameworks such as LangGraph, CrewAI, LlamaIndex, and the OpenAI Agents SDK, while also providing a managed runtime, built-in web search, and integrated guardrails.&lt;/p&gt;

&lt;p&gt;Microsoft has also unified its ecosystem with &lt;a href="https://learn.microsoft.com/en-us/agent-framework/" rel="noopener noreferrer"&gt;Microsoft Agent Framework&lt;/a&gt; 1.0, replacing both AutoGen and Semantic Kernel as the primary development framework. Combined with Foundry Agent Service, it delivers &lt;a href="https://www.bluetickconsultants.com/generative-ai-development/" rel="noopener noreferrer"&gt;managed hosting, durable execution&lt;/a&gt;, MCP support, and enterprise observability.&lt;/p&gt;

&lt;p&gt;Ultimately, the main trade-off is simplicity. AWS offers a more streamlined path from framework to managed runtime, while Microsoft’s ecosystem is more feature-rich but spread across multiple products such as Agent Framework, Foundry, Copilot Studio, Microsoft 365 Agents SDK, and Agent 365, making the learning and adoption curve steeper.&lt;/p&gt;

&lt;p&gt;Grounding and retrieval&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;Feature&lt;/strong&gt; | &lt;strong&gt;Amazon Bedrock&lt;/strong&gt; | &lt;strong&gt;Microsoft Foundry&lt;/strong&gt; |&lt;br&gt;
| &lt;strong&gt;Managed RAG&lt;/strong&gt; | Fully Managed Knowledge Bases with agentic retrieval | Foundry IQ with serverless, agentic retrieval |&lt;br&gt;
| &lt;strong&gt;Native Data Sources&lt;/strong&gt; | Amazon S3, Confluence, Salesforce, Web Crawling | SharePoint, Microsoft 365, Teams, Outlook, Azure SQL, Fabric, Live Web |&lt;br&gt;
| &lt;strong&gt;Search Engine&lt;/strong&gt; | Amazon OpenSearch (Vector + Hybrid Search) | Foundry IQ with MCP-based retrieval across enterprise data |&lt;br&gt;
| &lt;strong&gt;MCP Support&lt;/strong&gt; | Integrated through AgentCore Gateway | Native MCP support for all supported data sources |&lt;br&gt;
| &lt;strong&gt;Best Fit&lt;/strong&gt; | Organizations using AWS storage and enterprise applications | Organizations using Microsoft 365 and Azure ecosystem&lt;br&gt;&lt;br&gt;
 |&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Takeaway:
&lt;/h2&gt;

&lt;p&gt;The biggest differentiator is &lt;strong&gt;where your enterprise data already resides&lt;/strong&gt; , not the &lt;a href="https://www.bluetickconsultants.com/ai-and-ml-solutions/" rel="noopener noreferrer"&gt;retrieval technology&lt;/a&gt; itself. If your knowledge is in &lt;strong&gt;AWS services&lt;/strong&gt; , Bedrock is the natural choice. If it lives in &lt;strong&gt;Microsoft 365 and Azure&lt;/strong&gt; , Foundry provides deeper native integration.&lt;/p&gt;
&lt;h2&gt;
  
  
  Governance &amp;amp; Compliance: Key Differences
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Both platforms are enterprise-ready&lt;/strong&gt; with strong security, compliance, and governance capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Bedrock&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Supports ISO, SOC, GDPR, FedRAMP High, and is HIPAA eligible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bedrock Guardrails&lt;/strong&gt; provide content filtering and policy enforcement independent of the underlying model.&lt;/li&gt;
&lt;li&gt;Includes automated reasoning capabilities to improve response reliability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Foundry&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Inherits Azure’s enterprise security stack, including Entra ID, RBAC, Managed Identities, Private Endpoints, CMKs, and data residency controls.&lt;/li&gt;
&lt;li&gt;Ideal for organizations already invested in the Microsoft ecosystem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Important Consideration: Model Trust Boundary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure OpenAI models&lt;/strong&gt; run entirely within Microsoft’s Azure trust boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude on Microsoft Foundry&lt;/strong&gt; is delivered through Anthropic, making Anthropic the data processor.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com/news/claude-on-amazon-bedrock" rel="noopener noreferrer"&gt;Claude on Amazon Bedrock&lt;/a&gt; runs within your AWS environment, helping meet stricter data residency and compliance requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;Bedrock&lt;/strong&gt; if data residency and regulatory compliance (especially in Europe) are critical.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Foundry&lt;/strong&gt; if you’re primarily using Azure OpenAI models and are already standardized on Azure.&lt;/li&gt;
&lt;li&gt;Always verify the latest documentation, as cloud AI offerings and compliance capabilities evolve rapidly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Cost: where the money actually goes
&lt;/h2&gt;

&lt;p&gt;Notably, both platforms are pay-as-you-go and both track their model providers’ direct API pricing within a narrow band. Per-token rate shopping between them is rarely worth the effort.&lt;/p&gt;

&lt;p&gt;Three things move the number instead.&lt;/p&gt;
&lt;h3&gt;
  
  
  Data gravity and egress.
&lt;/h3&gt;

&lt;p&gt;If your applications run on Lambda or ECS and you call Bedrock, transit costs stay at zero. Hosting data in S3 while routing inference through Foundry introduces network egress fees and latency on every call. This integration tax compounds silently and is usually discovered after the architecture is set.&lt;/p&gt;
&lt;h3&gt;
  
  
  Routing and optimization Building blocks.
&lt;/h3&gt;

&lt;p&gt;Foundry’s Model Router deploys as a single endpoint and selects the underlying model per prompt, with modes optimized for balanced performance, cost, or quality. Bedrock counters with Intelligent Prompt Routing, prompt caching, and Model Distillation, where AWS reports distilled models running substantially faster and cheaper with limited accuracy loss. Both sets of building blocks are real and both are underused. Most teams leave meaningful savings on the table by calling one frontier model for every request, including the trivial ones.&lt;/p&gt;
&lt;h3&gt;
  
  
  The self-hosting tipping point.
&lt;/h3&gt;

&lt;p&gt;There is a threshold at which migrating high-volume, low-complexity work, such as classification, extraction, and routine summarization, onto a fine-tuned open-weight model on dedicated compute beats managed per-token pricing. Where that threshold sits depends on your token mix, latency tolerance, and the fully loaded cost of the engineers who will operate the inference stack. Be suspicious of any article that names a specific request-per-day number. Model your own workload. The managed-versus-self-hosted crossover has moved every year, and the operational cost of self-hosting is chronically understated.&lt;/p&gt;

&lt;p&gt;Worth noting: agent runtimes now bill separately from inference. Foundry Agent Service charges consumption on compute and memory, with model inference and persistent memory billed on top. Budget for the runtime as its own line item.&lt;/p&gt;
&lt;h2&gt;
  
  
  Which Should You Choose: Microsoft Foundry or Amazon Bedrock?
&lt;/h2&gt;

&lt;p&gt;First, retire the model-availability question. It no longer separates these platforms.&lt;/p&gt;

&lt;p&gt;At a glance, here is how the two platforms line up across the dimensions that actually decide it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Dimension&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Microsoft Foundry&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Amazon Bedrock&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model catalog&lt;/td&gt;
&lt;td&gt;1,900+ models listed, with a deep Hugging Face integration&lt;/td&gt;
&lt;td&gt;Roughly 18 providers and 110+ model variants, deliberately curated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontier models&lt;/td&gt;
&lt;td&gt;GPT-5.x family alongside the Claude line (Fable 5, Opus 4.8, Sonnet 5, Haiku 4.5)&lt;/td&gt;
&lt;td&gt;Claude line alongside GPT-5.5 and GPT-5.4, plus Amazon Nova&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent runtime&lt;/td&gt;
&lt;td&gt;Microsoft Agent Framework 1.0 (AutoGen and Semantic Kernel merged); Foundry Agent Service for managed hosting&lt;/td&gt;
&lt;td&gt;AgentCore: composable and framework-agnostic, with a managed harness that needs no orchestration code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grounding and retrieval&lt;/td&gt;
&lt;td&gt;Foundry IQ over MCP; native reach into SharePoint, Teams, Graph, Fabric, and Azure SQL&lt;/td&gt;
&lt;td&gt;Fully Managed Knowledge Bases via AgentCore Gateway; native S3, Confluence, and Salesforce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance and trust boundary&lt;/td&gt;
&lt;td&gt;Azure compliance stack and Entra ID; OpenAI is first-party, Claude is a third-party marketplace offering with no EU data zone today&lt;/td&gt;
&lt;td&gt;ISO, SOC, FedRAMP High, and HIPAA eligible; Claude inference runs in your own tenant with documented residency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost drivers&lt;/td&gt;
&lt;td&gt;Pay-as-you-go; Claude billed through Azure Marketplace and MACC; Model Router for per-prompt selection&lt;/td&gt;
&lt;td&gt;Pay-as-you-go; draws down AWS commitments; Intelligent Prompt Routing and distillation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Microsoft-centric shops on M365, Entra ID, and SharePoint with Azure-approved compliance&lt;/td&gt;
&lt;td&gt;AWS-native teams valuing composability, or anyone needing Claude in-tenant with residency, especially regulated EU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ask these instead, in order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Where does your data live, and what will it cost to move?&lt;/strong&gt; This is the highest-signal question and it usually answers the others. Cross-cloud inference carries a permanent tax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which trust boundary does your legal team need?&lt;/strong&gt; Not which platform, which boundary. First-party inference and third-party marketplace inference are different things wearing the same badge. If you are in a regulated European industry and Claude is central to your architecture, this question likely eliminates Foundry today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much orchestration control do you want, and how much churn can you absorb?&lt;/strong&gt; Bedrock and AgentCore give you a composable, framework-agnostic runtime and a &lt;a href="https://www.bluetickconsultants.com/enterprise-ai-consulting-implementation-services/" rel="noopener noreferrer"&gt;cleaner path from prototype to production&lt;/a&gt;. Microsoft gives you a richer integrated ecosystem, deeper Microsoft 365 reach, and a wider set of surfaces to keep track of. Both vendors just forced a migration on their existing agent customers. Assume they will do it again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is your team’s existing operational muscle?&lt;/strong&gt; Foundry rewards Microsoft shops with Entra ID, Fabric, and SharePoint already in production. Bedrock rewards teams fluent in IAM, CloudTrail, VPC endpoints, and the AWS building-block style.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Therefore, if you are Microsoft-centric, run Microsoft 365 and Entra ID, want evaluation, observability, and agent monitoring in one console, and your compliance posture is already Azure-approved, Foundry is the path of least resistance.&lt;/p&gt;
&lt;h2&gt;
  
  
  A concrete example of where that plays out:
&lt;/h2&gt;

&lt;p&gt;A national insurer building an internal underwriting assistant. Its policy documents, underwriting guidelines, and claims correspondence already live in SharePoint and Teams, identity runs through Entra ID, and its compliance team approved Azure years ago. It wants an agent that answers underwriter questions from that corpus and logs every interaction for audit. Foundry IQ reaches SharePoint and Microsoft Graph natively, Agent 365 gives governance the audit surface it needs, and legal has no new trust boundary to review. The knowledge never leaves the environment it already lives in, which is exactly why the project ships in a quarter instead of a year.&lt;/p&gt;

&lt;p&gt;If you are AWS-native, value composability over integration, want a framework-agnostic agent runtime, or need Claude inference running inside your own tenant with documented residency guarantees, Bedrock is the stronger fit.&lt;/p&gt;
&lt;h2&gt;
  
  
  A concrete example of where that is the clear call:
&lt;/h2&gt;

&lt;p&gt;A European digital bank building customer operations on Claude. It needs documented data residency and inference that runs inside its own cloud tenant, and its regulators will not accept a third-party marketplace processor subject to the CLOUD Act. That single constraint decides it. Claude through Bedrock keeps inference in-tenant with residency guarantees the bank’s legal team can point to, and Foundry, today, cannot offer the Claude equivalent. Here the governance section outranks everything else, exactly as warned.&lt;/p&gt;

&lt;p&gt;And if your honest answer is “we are already both,” you are not unusual. The multi-cloud reality is why model gateways and MCP-based abstraction layers went from a nice-to-have to a design pattern in the space of about a year. Build the abstraction before you need it, not after your provider announces the next rename. Not sure which platform fits your architecture? Get a &lt;a href="https://www.bluetickconsultants.com/free-ai-opportunity-audit/" rel="noopener noreferrer"&gt;free AI Opportunity Audit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That abstraction is smaller than it sounds. A thin provider interface lets your application target either cloud, so switching Claude between Bedrock and Foundry, or moving a workload entirely, becomes a configuration change rather than a rewrite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# A thin provider interface: swap clouds without touching application code
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModelRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;NotImplementedError&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BedrockProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModelProvider&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Claude inference stays inside your own AWS tenant
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModelRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bedrock_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;converse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-fable-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FoundryProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModelProvider&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Billed through Azure Marketplace against your MACC
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModelRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;foundry_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModelProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ModelRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are an internal knowledge assistant. Cite your sources.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Switching providers is a one-line change, not a re-architecture
&lt;/span&gt;&lt;span class="n"&gt;gateway&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this quarter&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s underwriting exceptions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This same discipline of writing precise, portable specs instead of one-off prompts is why &lt;a href="https://www.bluetickconsultants.com/spec-engineering-replaces-prompt-engineering/" rel="noopener noreferrer"&gt;spec engineering&lt;/a&gt; is becoming a core skill for AI teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ: Microsoft Foundry vs Amazon Bedrock
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which platform is better for regulated industries like banking or healthcare?
&lt;/h3&gt;

&lt;p&gt;It depends on which trust boundary your compliance team requires. Amazon Bedrock runs Claude inference inside your own AWS tenant with documented data residency, which tends to satisfy stricter regulatory requirements, especially in the EU. Microsoft Foundry delivers Claude through Anthropic as a third-party marketplace processor, which may not meet the same residency bar today.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use both Microsoft Foundry and Amazon Bedrock at the same time?
&lt;/h3&gt;

&lt;p&gt;Yes, and many enterprises already do. A common pattern is running Foundry for internal Microsoft 365-integrated tools while using Bedrock for AWS-native or Claude-in-tenant workloads. A thin provider-agnostic abstraction layer (see the code example above) makes switching between the two a configuration change rather than a rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does switching agent runtimes require rebuilding my agents from scratch?
&lt;/h3&gt;

&lt;p&gt;Not necessarily, but expect some migration work. AWS moved from Bedrock Agents to AgentCore, and Microsoft merged AutoGen and Semantic Kernel into Agent Framework 1.0 – both vendors have already forced at least one runtime migration on existing customers, so building with framework-agnostic tooling (like LangGraph or CrewAI) reduces future lock-in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Microsoft Foundry the same as Azure AI Foundry?
&lt;/h3&gt;

&lt;p&gt;Yes. Azure AI Studio was rebranded to Azure AI Foundry in late 2024, then renamed again to Microsoft Foundry. Most documentation and practitioners still use “Azure AI Foundry” interchangeably, so don’t assume they’re different products if you see both names.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which platform has lower costs?
&lt;/h3&gt;

&lt;p&gt;Per-token pricing is similar on both platforms since they track each model provider’s direct API rates. The bigger cost differences come from data egress fees (if your data and inference are on different clouds), agent runtime billing (which is now separate from model inference on both platforms), and whether you eventually migrate high-volume, low-complexity workloads to self-hosted open-weight models.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Platform capabilities, model availability, and residency terms in this space change on a monthly cadence. Every claim here reflects publicly available documentation and reporting as of July 2026 and should be verified against vendor documentation before an architectural commitment is made.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/microsoft-foundry-vs-amazon-bedrock-2026/" rel="noopener noreferrer"&gt;Microsoft Foundry vs Amazon Bedrock in 2026: The Model Is No Longer the Decision&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloudaiinfrastructur</category>
      <category>aiagents</category>
      <category>amazonbedrock</category>
      <category>cloudarchitecture</category>
    </item>
    <item>
      <title>Claude Tag: Bringing an AI Teammate Into Your Workspace</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Fri, 17 Jul 2026 00:00:07 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/claude-tag-bringing-an-ai-teammate-into-your-workspace-4api</link>
      <guid>https://dev.to/bluetickconsultants_inc/claude-tag-bringing-an-ai-teammate-into-your-workspace-4api</guid>
      <description>&lt;p&gt;&lt;em&gt;How tagging &lt;a class="mentioned-user" href="https://dev.to/claude"&gt;@claude&lt;/a&gt; in Slack turns AI from a tool you visit into a colleague that pulls its weight&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most &lt;a href="https://www.bluetickconsultants.com/ai-and-ml-solutions/" rel="noopener noreferrer"&gt;AI tools&lt;/a&gt; sit and wait. You open a tab, type a prompt, copy the answer back into your real work, and close it again. Claude Tag turns that model inside out. Instead of you going to the AI, the AI comes to where your team already works, and it starts pulling its weight like any other member of the team.&lt;/p&gt;

&lt;p&gt;Here’s what Claude Tag is, why it matters, how your team can put it to work, where it’s heading, and the mistakes to steer clear of along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Claude Tag?
&lt;/h2&gt;

&lt;p&gt;Claude Tag is a new way for teams to work with Claude, and it starts in Slack. Rather than living in a separate app, Claude joins your workspace as a team member. An administrator grants it access to the channels, tools, data, and even codebases you choose, and from then on anyone in a channel can simply tag &lt;a class="mentioned-user" href="https://dev.to/claude"&gt;@claude&lt;/a&gt; and hand off a task.&lt;/p&gt;

&lt;p&gt;When you tag Claude with a request in plain language, it breaks the work into stages and works through them using the tools it has access to. Then it replies in the thread with what it produced: a drafted document, a data analysis, a merged pull request, or a step toward resolving an incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  You can reach Claude through three surfaces:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Channel tagging:&lt;/strong&gt; tag &lt;a class="mentioned-user" href="https://dev.to/claude"&gt;@claude&lt;/a&gt; in a channel and the whole team can follow along as it works in the thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct messages:&lt;/strong&gt; start a private conversation for work you’d rather keep out of a shared channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI assistant panel:&lt;/strong&gt; open Claude from anywhere in Slack using the assistant icon.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Built on Claude Opus 4.8
&lt;/h3&gt;

&lt;p&gt;Claude Tag is the next generation of Claude Code, made more proactive and built to work with a full team rather than a single person. It runs on Claude Opus 4.8, acts under its own identity, remembers the relevant context from the channels it’s in, and can follow up on its own. Anthropic reports that it has become one of the main ways its own teams get work done. In fact, 65% of its product team’s code now comes from an internal version. That pattern has spread beyond engineering, too, into chasing down product metrics, working through support tickets, and tracking tricky bugs. Slack’s leadership has described the change as making AI “multiplayer”: instead of a private back and forth in a DM, your assistant shows up in the open where the team already works.&lt;/p&gt;

&lt;p&gt;If your organization already uses the &lt;a href="https://www.anthropic.com/news/claude-in-slack" rel="noopener noreferrer"&gt;Claude in Slack app&lt;/a&gt;, Claude Tag is a transition rather than a fresh install. It runs under the same Slack app, your existing setup keeps working, and administrators have a 30 day window to opt in. The older experience switches over to Claude Tag on August 3, 2026, so the move comes with a deadline attached. Eligible Team and Enterprise organizations also get an introductory launch credit so they can trial it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the benefits?
&lt;/h2&gt;

&lt;p&gt;What makes Claude Tag different from a normal chatbot is simple: it behaves more like a colleague than a tool. A few qualities stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It’s multiplayer.&lt;/strong&gt; Within a channel there’s a single Claude that everyone shares. Because the whole exchange stays visible, a teammate can steer it mid-task or pick up exactly where someone else left off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It learns over time.&lt;/strong&gt; As Claude follows a channel, it builds context about the work, so people don’t have to re-explain the basics on every request. With permission, it can also draw on knowledge from other channels and connected sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It takes initiative.&lt;/strong&gt; Turn on ambient behavior and Claude stops waiting to be asked. It flags relevant information from across its channels and tools, and follows up on threads or tasks that have gone quiet without being resolved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works asynchronously.&lt;/strong&gt; Hand it a task and get on with your day. Claude can schedule work for itself and pursue a project over hours or days, which means a team can delegate to many Claudes running in parallel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It’s governable.&lt;/strong&gt; Administrators decide exactly which tools and data each channel’s Claude can reach, set hard spending limits for the organization and for individual channels, and review an audit log of every action and who requested it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Putting Claude Tag to work day to day
&lt;/h2&gt;

&lt;p&gt;The clearest way to understand Claude Tag is to picture it living in the channels your team already uses. A few examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HR operations.&lt;/strong&gt; Drop Claude into an #hr-help channel connected to your policy documents and HR systems. Employees can ask about leave balances, benefits, or expense rules and get an instant, consistent answer instead of waiting on the HR team. Behind the scenes, Claude can draft job descriptions, summarize themes from exit-interview notes, or flag requisitions that have been sitting without approval. Because it remembers the channel’s context, the HR team isn’t re-explaining policy every week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Onboarding.&lt;/strong&gt; A new hire’s first days are full of small, repetitive questions. In an #onboarding channel, Claude can welcome each joiner, point them to the right setup guides and accounts, and answer the endless “where do I find this?” questions. With ambient behavior on, it can also nudge a manager when a checklist item has stalled or a first-week task is still incomplete. The new hire gets help on demand, and the people who would normally field those questions get their time back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beyond HR.&lt;/strong&gt; The same pattern extends across the company. A support team can tag Claude to triage incoming tickets, a product team can ask it to chase down metrics, an engineering channel can have it investigate the root cause of a tricky bug or &lt;a href="https://www.bluetickconsultants.com/talk-to-code/" rel="noopener noreferrer"&gt;open a pull request&lt;/a&gt;, and a sales team can have it follow up on quiet deals. Each lives in its own channel with its own scoped access, so the sales Claude never touches engineering’s data and vice versa.&lt;/p&gt;

&lt;p&gt;In every case the payoff is the same: routine, context-heavy work gets handled right where it happens, which frees your people to focus on the judgment calls that actually need them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this shapes the future of work
&lt;/h2&gt;

&lt;p&gt;Claude Tag points to a real shift in how teams and AI work together. Three changes stand out.&lt;/p&gt;

&lt;p&gt;First, the default interaction is flipping from “open an app and prompt” to “delegate to a teammate who’s already here.” When AI lives in the flow of work, using it stops being a separate task.&lt;/p&gt;

&lt;p&gt;Second, work becomes parallel. If one person can hand off several tasks to several Claude’s at once and check back later, the bottleneck shifts. It moves from doing the work to directing and reviewing it. Orchestrating and quality-checking AI teammates becomes a core professional skill.&lt;/p&gt;

&lt;p&gt;Third, institutional knowledge stops living only in people’s heads. A Claude that remembers a channel’s history becomes a kind of durable, shared memory: context that survives when individuals are busy, on leave, or move on.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Battle for the Workplace
&lt;/h3&gt;

&lt;p&gt;There’s a commercial story here too. Tools that behave like a “virtual employee” living inside a workspace are quickly becoming the battleground for &lt;a href="https://www.bluetickconsultants.com/enterprise-ai-consulting-implementation-services/" rel="noopener noreferrer"&gt;enterprise AI&lt;/a&gt;, and Claude Tag is Anthropic’s bid to own that entry point in Slack before rivals do. For buyers, the real takeaway isn’t about any single vendor. It’s about a change in what “using AI at work” even means, from a tool that individuals open to shared infrastructure a whole organization plans around.&lt;/p&gt;

&lt;p&gt;Anthropic has said it plans to bring Claude Tag well beyond Slack over time. If it gets there, an AI teammate that’s present, proactive, and accountable across every place a team works won’t feel like a product feature anymore. It’ll just be how work gets done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to avoid when using Claude Tag
&lt;/h2&gt;

&lt;p&gt;A proactive AI in your workspace is powerful precisely because it has access and initiative, and that’s exactly why a few habits matter. Avoid these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Granting access too broadly.&lt;/strong&gt; Scope each channel’s tools, data, and repositories to what that work actually needs. Use private channels to keep sensitive connections (legal, finance, HR) separate from everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping spend limits.&lt;/strong&gt; Claude Tag is consumption-based, so set an organization-wide cap and per-channel limits before a wide rollout, and watch the alerts that fire at 75% and 95% of a limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Putting sensitive material in the wrong place.&lt;/strong&gt; Memory is scoped to the channel, so be deliberate about where confidential conversations happen, and remember Claude won’t report out from private channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping governance.&lt;/strong&gt; Review what Claude remembers, check the audit log of tasks and actions, and remember that only a Primary Owner or Owner should configure its access, not every admin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Letting it act on untrusted input.&lt;/strong&gt; Claude reads the conversation around it and can follow instructions buried in those messages, so keep it to trusted channels and be deliberate about what external or unvetted content it can see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating its output as final.&lt;/strong&gt; Claude drafts, analyzes, and proposes; a person should still review pull requests, data, and decisions before they ship.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confusing the billing surfaces.&lt;/strong&gt; Tagging Claude in a channel is billed to the organization under its shared identity, while direct messages run on your personal Claude account. Worth knowing before people lean on one or the other.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used well, Claude Tag isn’t a chatbot you visit. It’s a teammate you trust with the routine, so your people can spend their time where it actually counts.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.bluetickconsultants.com/claude-tag-ai-teammate-slack/" rel="noopener noreferrer"&gt;Claude Tag: Bringing an AI Teammate Into Your Workspace&lt;/a&gt; appeared first on &lt;a href="https://www.bluetickconsultants.com" rel="noopener noreferrer"&gt;Bluetick Consultants Inc.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>anthropic</category>
      <category>slack</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Governance: Innovation, Risk Management, and Boardroom Accountability</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Mon, 30 Jun 2025 13:13:45 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/ai-governance-innovation-risk-management-and-boardroom-accountability-ip0</link>
      <guid>https://dev.to/bluetickconsultants_inc/ai-governance-innovation-risk-management-and-boardroom-accountability-ip0</guid>
      <description>&lt;p&gt;The Boardroom Wake-Up Call&lt;br&gt;
Picture it's 2 AM, and your phone is buzzing with urgent messages. Your company's AI system just made a decision that could either save millions or trigger a regulatory nightmare. As you sit up in bed, one terrifying thought crosses your mind: "Do I even know how to evaluate whether this AI system is helping or hurting us?"&lt;br&gt;
Everyone’s talking about artificial general intelligence, gen AI, AI agents, automation... The board is excited. And you’re probably already managing a few AI-powered tools or features across your org.&lt;br&gt;
But here’s what almost no one’s saying out loud:&lt;br&gt;
We’ve built the engine. We’re building the rocket. But no one’s talking about the control panel.&lt;br&gt;
That’s what AI governance is. And in 2025, it’s exactly what will separate those who scale AI confidently and those who end up in cleanup mode when something goes wrong.&lt;/p&gt;

&lt;p&gt;What is AI governance&lt;br&gt;
If the board asked, “How much risk is being run with our current AI use and what are those risks?” could the impact, dependencies, and safeguards behind each AI system be clearly explained? A strong governance model is how those answers are delivered confidently.&lt;br&gt;
AI governance isn’t a document or a dashboard. It’s the entire system that ensures your AI works the way it’s supposed to even when you’re not in the room.&lt;br&gt;
AI governance is the framework of policies, processes, and accountability measures that ensure AI systems are used safely, ethically, and effectively within an organization. It covers decision rights, risk management, compliance, and oversight across the AI lifecycle.&lt;br&gt;
According to McKinsey's March 2025 study, AI governance led by the CEO or board of directors correlates with stronger AI return on investment (ROI). Specifically, 28% of companies report that their CEO is responsible for AI governance, while 17% say the board of directors leads on AI governance. &lt;br&gt;
That’s why leading firms tie governance directly to budget owners and tech execs. &lt;/p&gt;

&lt;p&gt;What’s really at stake for your team, your board, and your company&lt;br&gt;
You’re rolling out artificial intelligence, from AI automation in ops to experimenting with gen AI for customer service. But when you think of AI, I want you to think two steps ahead and ask yourself:&lt;br&gt;
Could this go sideways and who’s watching?&lt;/p&gt;

&lt;p&gt;When the board asks ‘show me the guardrails,’ what do I say?&lt;/p&gt;

&lt;p&gt;Why it matters right now and what happens if you don’t act&lt;br&gt;
If your company is already using some form of artificial intelligence whether that’s intelligent automation, predictive analytics, or generative AI tools embedded in your SaaS stack, then here’s the real problem: AI adoption has outpaced AI accountability.&lt;br&gt;
And when things go wrong with AI, they go wrong fast and publicly without leaving time to fix it quietly behind the scenes.&lt;br&gt;
Let me paint three real, simple scenarios:&lt;br&gt;
An internal HR chatbot gives biased hiring suggestions and you don’t find out until someone files a complaint.&lt;/p&gt;

&lt;p&gt;A generative AI tool generates customer-facing content that accidentally violates compliance language.&lt;/p&gt;

&lt;p&gt;An AI model used in underwriting quietly updates itself after a few months of drift, and approval rates change with no one noticing until your CFO flags anomalies in quarterly revenue.&lt;/p&gt;

&lt;p&gt;None of these sound like sci-fi. They sound like tomorrow morning's email.&lt;br&gt;
Without AI governance, you don’t just risk technical debt, you risk legal exposure, reputational loss, and customer trust. And, that’s why approximately 47% of companies reported AI governance as one of their top five strategic priorities.&lt;/p&gt;

&lt;p&gt;AI Governance Framework: What it looks like in practice&lt;br&gt;
This isn’t about creating bureaucracy. This is about having a system that supports growth without exposing you to blind spots. Here’s what that actually means:&lt;br&gt;
Clarity on what’s ‘AI’ in your company&lt;br&gt;
 Don’t assume everyone’s on the same page. Is gen AI in a CRM email builder considered AI? What about Excel plugins? Start by mapping what tools are in play and who owns them.&lt;/p&gt;

&lt;p&gt;Defined ownership and sign-off&lt;br&gt;
 Who decides if a new AI use case is approved? Is there a review process? Do you have criteria for high-risk vs low-risk AI? This isn’t just about compliance, it's about control.&lt;/p&gt;

&lt;p&gt;Auditability and explainability&lt;br&gt;
 If your board committee asks, “Why did our AI say no to that loan?” can you answer? Can you show inputs, outputs, and who touched the model last?&lt;/p&gt;

&lt;p&gt;Human-in-the-loop systems&lt;br&gt;
 Not every AI decision should be fully autonomous. For anything sensitive, hiring, finance, legal build in human checkpoints, just like you'd review a contract before signing it.&lt;/p&gt;

&lt;p&gt;Incident response before you need it&lt;br&gt;
 If your AI misfires, who does what? Who pulls the plug? Who talks to legal, PR, or compliance? You don’t want to write this plan after the mistake.&lt;/p&gt;

&lt;p&gt;Frequently Asked Questions on AI Governance&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is AI governance?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI governance is the set of policies, processes, and oversight mechanisms that ensure artificial intelligence systems are developed, deployed, and managed responsibly. It covers areas such as accountability, risk management, compliance, data ethics, and transparency helping organizations align AI use with business goals, legal requirements, and stakeholder trust.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What are the key components of an effective AI governance framework?&lt;br&gt;
A strong AI governance framework includes clear policies on data usage, model accountability, risk assessment, compliance (like GDPR/CCPA), and oversight roles. It ensures AI initiatives align with both business goals and ethical standards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How can we ensure our AI models are compliant with regulations and internal policies?&lt;br&gt;
Start by implementing audit trails, bias monitoring, and explainability protocols. Partnering with legal and compliance teams early helps reduce regulatory risk and builds trust across the organization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the best practices for setting up an AI ethics board or governance committee?&lt;br&gt;
Include cross-functional leaders from IT, legal, risk, and product teams. Define clear roles, review cycles, escalation paths, and set measurable KPIs to track responsible AI deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do we balance innovation speed with governance controls in AI development?&lt;br&gt;
Use a tiered approach to apply stricter governance to high-risk use cases (like healthcare or finance) while allowing more flexibility in lower-risk experimentation. Automating parts of the governance workflow also helps accelerate delivery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What tools or platforms can help us operationalize AI governance at scale?&lt;br&gt;
Look for platforms that offer model monitoring, bias detection, version control, and explainability dashboards. Many organizations integrate these with existing MLOps pipelines or use third-party tools built for enterprise AI oversight. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Final Word: What I’d Tell You If We Were in the Same Room&lt;br&gt;
Most companies right now are moving forward with AI and hoping it all just works out.&lt;br&gt;
They’re waiting for clearer regulations, vendor checklists, or someone to tell them, “This is how it’s done.”&lt;br&gt;
But there’s no one-size-fits-all for AI governance, where guidance is still catching up to the pace of deployment.&lt;br&gt;
That’s exactly why this is your leadership moment. If you're in charge of technology and you’re responsible for how AI gets built or scaled in your company then governance is not someone else’s job. It’s yours.&lt;br&gt;
When you take the time to build a governance model that fits your business, your risk appetite, and your culture,then you’re not slowing things down. You’re making sure they can actually scale. Safely. Accountably. Without the mess.&lt;br&gt;
Companies that treat AI governance as a foundation not an afterthought are already moving faster, earning more trust, and keeping regulators, investors, and customers on their side. And if you're not sure where to begin, that's okay. Most aren’t.&lt;/p&gt;

&lt;p&gt;Bluetick Consultants Inc.: Your Partner in Responsible, Scalable AI Integration&lt;br&gt;
At Bluetick, we don’t just build AI solutions, we work with leadership teams to build the operational trust layer that keeps innovation on course. Our AI practice combines deep technical knowledge with real-world understanding of enterprise governance, data privacy, and risk mitigation.&lt;br&gt;
Whether you're piloting your first generative AI tool or managing dozens of AI-powered workflows, we help you design governance systems that fit your org chart, not someone else's template, implement explainability, auditability, and human oversight in real environments and align technology with board-level accountability and regulatory readiness&lt;/p&gt;

&lt;p&gt;Our goal is simple: help you scale AI without creating messes you’ll have to clean up later. You can move fast and get it right.&lt;/p&gt;

&lt;p&gt;Looking to integrate AI into your business the right way? Speak with our AI team. We will help you design, govern, and scale AI securely and strategically.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build a Website That Grows Your Business</title>
      <dc:creator>Bluetick Consultants Inc.</dc:creator>
      <pubDate>Wed, 18 Jun 2025 13:41:03 +0000</pubDate>
      <link>https://dev.to/bluetickconsultants_inc/how-to-build-a-website-that-grows-your-business-983</link>
      <guid>https://dev.to/bluetickconsultants_inc/how-to-build-a-website-that-grows-your-business-983</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Whether you're launching a new product, offering services, or trying to build authority in your space, your website plays a direct role in how fast (or slow) your business grows. It's not just about how it looks; it’s about how it performs.&lt;/p&gt;

&lt;p&gt;Fast load times, airtight security, mobile responsiveness, and seamless user experience, these are no longer ‘nice to haves’. They’re what Google, and more importantly, your customers, expect. And if your current site falls short, you’re leaving money on the table, plain and simple.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll walk you through the technical essentials, and a step-by-step guide to building a results-driven website that performs from day one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Clarify Business Goals &amp;amp; Understand Your Audience&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start by defining the primary objectives for your website. Drive bookings? Increase online sales? Build trust in your brand? The answer will shape every decision moving forward, from design to development to user experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Define KPIs That Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think in terms of measurable outcomes. What does success look like? Some common KPIs to track for websites that grow businesses include: number of product or service bookings, conversion rates (newsletter signups, purchases, contact form submissions), engagement metrics (time on site, bounce rate) and brand visibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know Your Audience (Better Than Your Competitors Do)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not everyone visiting your site is ready to buy — some are just browsing, some are comparing options, and a few are ready to convert.&lt;br&gt;
Here’s how you can get into their heads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create user personas: Map out your typical customers — their roles, needs, goals, challenges, and the language they use.&lt;/li&gt;
&lt;li&gt;Define your core conversion paths: What are the top actions you want users to take? Whether it’s scheduling a demo, requesting a quote, or downloading a brochure, your site needs to guide them toward that action seamlessly.&lt;/li&gt;
&lt;li&gt;Collect real input: Talk to your sales team, support team, or even your customers to understand what information they look for on your site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Align Features With Your Goals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make sure you have a fast, mobile-optimized booking system, smart forms, and CRM integration. Every feature you add should serve a purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Choose the Right Platform &amp;amp; Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your choice of platform and technical setup lays the foundation for everything else — speed, SEO, security, scalability, and how easy it is to maintain or expand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why WordPress is a Smart Choice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want flexibility, scalability, and full control over your site, go with WordPress. WordPress powers 43.4% of the web worldwide for a reason. Whether you're running a small business or scaling to serve enterprise-level traffic, WordPress grows with you. You get access to thousands of plugins, themes, and developer-friendly tools that help you&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managed Hosting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s what you should look for in your hosting setup: Free SSL Certificate (for security), Fast Load Speeds (with built-in caching and CDN support), and Daily Automated Backups (to restore your site with a single click)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-Side Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While you might not interact with these features daily, they play a big role in performance and security: HTTP/2 Support (Ensures faster page load times by sending multiple requests in parallel), Compression (like GZIP or Brotli) (reduces the file size) and Automatic Security Patches (keeps server and CMS up to date and protected from the latest threats).&lt;/p&gt;

&lt;p&gt;When you get the platform and infrastructure right, your site becomes faster, safer, and easier to grow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Prioritize UX: Mobile, Speed &amp;amp; Navigation&lt;/strong&gt;&lt;br&gt;
user experience (UX) needs to be at the heart of your design decisions. It’s not just about how your website looks — it’s about how easily your visitors can browse, click, read, and act.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with Mobile-First Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;According to Google, in 2025, more than 50% of global web traffic now comes from mobile devices. If your website isn’t optimized for smartphones and tablets, you’re likely losing potential customers before they even read your headline. Make clean layouts, readable text, and easy navigation. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimize for Core Web Vitals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google’s Core Web Vitals impact your SEO and user retention. At the very least, aim for Page load time under 3 seconds, Stable visual elements (no unexpected shifts) and Responsive interactivity (buttons respond fast when tapped).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplify Navigation for Real Users&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of good navigation as a silent salesperson, helping users find exactly what they need without frustration.&lt;br&gt;
Here’s how you can do it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use breadcrumb trails so users know where they are&lt;/li&gt;
&lt;li&gt;Ensure touch targets (like buttons) are spaced for fingers, not just mouse clicks&lt;/li&gt;
&lt;li&gt;Keep menus simple and intuitive — no endless dropdowns or hidden links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Build a Secure &amp;amp; Trustworthy Site&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users today expect a safe browsing experience — and search engines reward secure websites too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implement SSL/TLS Across the Entire Site&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An SSL certificate encrypts data between your site and your visitors — essential for protecting sensitive information like contact forms, login credentials, or payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enforce HTTPS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s not enough to install SSL. Force HTTPS across all pages from top to bottom. Set up automatic redirects from HTTP to HTTPS to ensure every visit is secure, no matter how someone lands on your site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secure All Logins&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your login page is a common target for attackers. You can harden it with simple steps: Enable Two-Factor Authentication (2FA), Limit Login Attempts, and Use Strong Password Policies. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add Essential Security Layers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To build a website that supports long-term business growth, you also need proactive protection:&lt;br&gt;
Web Application Firewall (WAF) – Blocks malicious traffic before it reaches your site.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Malware Scanning – Regular scans help detect and remove threats quickly.&lt;/li&gt;
&lt;li&gt;Offsite Backups – Back up your website daily to a remote location — so you can recover quickly if anything goes wrong.&lt;/li&gt;
&lt;li&gt;Uptime Monitoring – Get alerted the moment your website goes down and minimize disruptions to your business.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5.  Set Up a Strong Technical SEO Foundation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even the most beautiful, feature-packed site won’t perform if search engines can’t crawl, understand, and rank it properly. Let’s break down what a strong technical SEO foundation actually looks like and how you can put it in place.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a sitemap and robots.txt to guide Google on what to crawl.&lt;/li&gt;
&lt;li&gt;Use schema markup to help content appear with rich results (like ratings or FAQs).&lt;/li&gt;
&lt;li&gt;Write clear titles and meta descriptions — they’re what users see in search results.&lt;/li&gt;
&lt;li&gt;Focus on speed, mobile-friendliness, and Google’s Core Web Vitals.&lt;/li&gt;
&lt;li&gt;Use Search Console to track visibility and fix issues.&lt;/li&gt;
&lt;li&gt;Good technical SEO makes sure your website gets found — and stays found.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6.  Show Trust &amp;amp; Track Performance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your website has to feel safe. If it doesn’t, visitors won’t stick around long enough to become customers. You can instantly boost trust by displaying trust signals like visible SSL certificates, payment security badges, or “verified by” icons from trusted providers.&lt;/p&gt;

&lt;p&gt;These small visual cues create big confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track what’s working (and what’s not)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once your site is live, don’t leave it on autopilot. Start by setting up the basics: Google Analytics to track visitors, Search Console to monitor rankings, and real-time monitoring tools like Hotjar or Clarity to see how users behave.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7.  Keep Optimizing &amp;amp; Maintaining&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t treat your website as a one-time project. A well-maintained site performs better, ranks higher, and offers a smoother experience for users. Run monthly speed and security checks, making sure your pages load fast. Every quarter, test how your site looks and works across different devices and browsers. And every six months, audit your SEO, refresh your Core Web Vitals, and update or remove outdated plugins and themes. This regular upkeep keeps your site fast, reliable, and ready to grow your business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case Study: How We built an E-Commerce Website that Triple Online Sales&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of our clients ran a successful retail business but their website wasn’t bringing in results. It was slow, hard to navigate, and users often dropped off before completing a purchase.&lt;br&gt;
We stepped in to rebuild the e-commerce site with clear goals faster performance, easier navigation, and a smoother checkout experience. We used a modern tech stack, cleaned up the product structure, and made the site mobile-friendly. We also integrated real-time stock updates and a reliable payment system. We’ve added a dynamic product recommendation engine powered by basic AI models to improve user engagement.&lt;br&gt;
We didn’t overcomplicate it — just fixed what mattered.&lt;/p&gt;

&lt;p&gt;After launch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sales from the website tripled in 60 days&lt;/li&gt;
&lt;li&gt;Drop-off during checkout went down by over 50%&lt;/li&gt;
&lt;li&gt;The site now loads in under 2 seconds, even on mobile&lt;/li&gt;
&lt;li&gt;Customer support tickets related to the website dropped significantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Focus on speed, usability, and reliability. The results will follow just like they did for this client.&lt;/p&gt;

&lt;p&gt;5 Critical Website Failures Your Business Can’t Ignore&lt;br&gt;
Even the best looking websites fail to grow if key issues go unchecked. Let’s fix all the issues hurting your traffic, leads, and trust.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why is my website loading so slowly, and why does it matter?
If your website takes more than 3 seconds to load, over 50% of your users will leave.
How to fix: Compress images, use browser caching, enable a CDN, and minify code.&lt;/li&gt;
&lt;li&gt;Is my website secure enough?
If you're missing SSL or running outdated plugins, it will risk losing your data. Search engines also penalize unsecured websites.
How to fix: Use HTTPS, install a Web Application Firewall, enable 2FA, and update software regularly.&lt;/li&gt;
&lt;li&gt;Why aren’t visitors filling out our forms?
Often, it’s because your forms are too complicated, glitchy, or hard to use on mobile.
How to fix: Cut down fields, enable auto-fill, use mobile-friendly input, and add real-time validation.&lt;/li&gt;
&lt;li&gt;Does my mobile site experience affect conversions and SEO?
Absolutely. Over 60% of traffic is from mobile now. If your mobile UX or navigation is clunky, you’ll see higher bounce rates and lower rankings.
How to fix: Use a mobile-first design, large buttons, simple menus, and test on real devices.&lt;/li&gt;
&lt;li&gt;What if we ignore technical SEO?
Search engines won’t find or rank your site properly. That means less organic traffic, fewer leads, and more ad spend to compensate.
How to fix: Set up sitemaps and robots.txt, use schema, clean URLs, and optimize metadata. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Top Web Development Company&lt;br&gt;
When you're investing in a business website, it shouldn't just sit there, it should bring results. That's why we focus on building websites that help to grow your businesses.&lt;br&gt;
At Bluetick, we build high-performance websites using modern technologies like WordPress, Shopify, Webflow, Jamstack &amp;amp; Headless CMS.&lt;br&gt;
We’re a web development company trusted by startups and enterprises across industries. Our websites load fast, scale easily, stay secure, and work as hard as you do.&lt;br&gt;
You get direct access to senior developers, business-first solutions, clear timelines, honest communication and proven experience.&lt;/p&gt;

&lt;p&gt;We understand how frustrating it is to pour money into a website that doesn’t deliver. That’s why every line of code we write serves a purpose: better performance, better leads, better business outcomes.&lt;br&gt;
Whether it’s WordPress, Shopify, Webflow, Jamstack, or a Headless CMS, if you’re looking to build a website that works, not just exists, Bluetick is ready to build it with you.&lt;/p&gt;

&lt;p&gt;Ready to launch a modern website that delivers real results? Let’s talk about the right tech stack for your business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bluetickconsultants.com/contact/" rel="noopener noreferrer"&gt;Book a free consultation with the Bluetick team.&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdesignstrategy</category>
      <category>webdev</category>
      <category>wordpress</category>
      <category>website</category>
    </item>
  </channel>
</rss>
