<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>The Brian Journal</title>
    <link>https://bcastelino.com/blogs/</link>
    <description>Brian Castelino on Databricks, data engineering, and shipping LLM systems into production. Long-form, sourced, and honest about what broke.</description>
    <language>en-us</language>
    <managingEditor>Brian Castelino</managingEditor>
    <lastBuildDate>Sun, 13 Sep 2026 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://bcastelino.com/blogs/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ChicagoPulse Won Gold in the Databricks Genie App Challenge</title>
      <link>https://bcastelino.com/blogs/blog/genie-app-wins-databricks-challenge/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/genie-app-wins-databricks-challenge/</guid>
      <pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>databricks</category>
      <category>databricks-genie</category>
      <category>ai-engineering</category>
      <category>data-engineering</category>
      <description><![CDATA[ChicagoPulse won Gold in the Databricks Genie-Powered App Challenge. Here is how governed metrics, evaluation, and visible evidence turned a civic-data chatbot into an app people can inspect and trust.]]></description>
      <content:encoded><![CDATA[<p>ChicagoPulse won <strong>Gold and first place in Track A, Real World Problem Solving</strong>, in the 2026 <a href="https://community.databricks.com/t5/learning-events/databricks-community-contest-genie-powered-app-challenge/ev-p/165825">Databricks Community Genie-Powered App Challenge</a>. The project scored <strong>35.7 points</strong>, finished as the top Track A entry, and was selected for a BrickTalk spotlight.</p>
<p>The medal matters to me. The more useful story for an engineer, though, is what sat behind the demo: governed metrics, a real data pipeline, a 30-question evaluation suite, constrained server APIs, and product decisions that let a user inspect why an AI-generated answer should be trusted.</p>
<img src="/blogs/posts/genie-app-gold-win.jpg" alt="Databricks Community Contest graphic naming Brian Denis Castelino and ChicagoPulse as the Gold winner in Track A with 35.7 points" style="display:block;width:100%;margin:2rem 0;border-radius:12px;" />
<h2 id="what-chicagopulse-does-with-databricks-genie"><span class="sec-num" aria-hidden="true">01</span>What ChicagoPulse does with Databricks Genie</h2>
<p><strong>ChicagoPulse is a Databricks App that turns governed City of Chicago open data into plain-language answers, neighborhood comparisons, maps, and transparent data-health signals.</strong> It is built for residents, community organizations, and civic-data practitioners who want local context without first learning Socrata APIs, SQL, or the structure of several municipal datasets.</p>
<p>The app has three connected surfaces:</p>
<ol>
<li><strong>Ask ChicagoPulse</strong> answers natural-language questions through Databricks Genie. A user can inspect the generated SQL, chart or table, source identifiers, request provenance, and suggested follow-up questions.</li>
<li><strong>Neighborhood Pulse</strong> covers all <strong>77 official Chicago Community Areas</strong>, with a choropleth, completed-month metrics, 12-month trends, and comparisons for up to four areas.</li>
<li><strong>Data Health</strong> shows whether the pipeline actually completed, when each source was ingested, what period the app reports, and how much source data is available.</li>
</ol>
<img src="/blogs/posts/chicagopulse-hero.png" alt="ChicagoPulse interface showing the Chicago skyline and entry points for Ask ChicagoPulse, Neighborhood Pulse, and Data Health" style="display:block;width:100%;margin:2rem 0;border-radius:12px;" />
<p>ChicagoPulse currently models four official City datasets:</p>
<div class="table-wrap" data-cols="2"><div class="table-scroll"><table>
<thead>
<tr>
<th>Signal in ChicagoPulse</th>
<th>Official City of Chicago dataset</th>
</tr>
</thead>
<tbody>
<tr>
<td>Service demand</td>
<td><a href="https://data.cityofchicago.org/d/v6vf-nfxy">311 Service Requests</a></td>
</tr>
<tr>
<td>Business activity</td>
<td><a href="https://data.cityofchicago.org/d/r5kz-chrr">Business Licenses</a></td>
</tr>
<tr>
<td>Development activity</td>
<td><a href="https://data.cityofchicago.org/d/ydr8-5enu">Building Permits</a></td>
</tr>
<tr>
<td>Property conditions</td>
<td><a href="https://data.cityofchicago.org/d/22u3-xenr">Building Violations</a></td>
</tr>
</tbody>
</table></div></div>
<p>The product question was never merely, "Can Genie answer a question?" The harder question was, "Can someone understand the answer, inspect its evidence, and decide whether the underlying data is current enough for their purpose?"</p>
<h2 id="a-civic-data-chatbot-is-not-enough"><span class="sec-num" aria-hidden="true">02</span>A civic-data chatbot is not enough</h2>
<p>City open-data portals contain valuable records, but access is not the same as usability. A resident asking how 311 demand changed in Austin should not need to discover the correct dataset, decode its columns, learn Chicago's Community Area identifiers, choose a complete reporting period, and write a defensible aggregation before seeing an answer.</p>
<p>Natural-language querying removes much of that friction. It also creates a new failure mode: a fluent answer can hide the wrong metric, an incomplete month, stale data, or a plausible query built at the wrong grain.</p>
<p>That is especially uncomfortable in a civic context. ChicagoPulse is not emergency, legal, or policy decision support, but the product still needs to show its work. I treated evidence as part of the interface, not as an implementation detail buried in logs.</p>
<h2 id="the-architecture-behind-the-chat-box"><span class="sec-num" aria-hidden="true">03</span>The architecture behind the chat box</h2>
<p>The deployed frontend and API run together as a Databricks App. React and TypeScript provide the interface, while FastAPI is the normalization and security boundary between the browser and Databricks services.</p>
<svg role="img" aria-label="ChicagoPulse architecture diagram" viewBox="0 0 720 630" style="display:block;width:100%;max-width:720px;height:auto;margin:1.5rem auto;" xmlns="http://www.w3.org/2000/svg">
  <title>ChicagoPulse data and application architecture</title>
  <desc>City of Chicago Socrata APIs feed a Bronze, Silver, and Gold pipeline into Unity Catalog Metric Views. A React and TypeScript client calls FastAPI, which orchestrates Genie, SQL Warehouse, and Jobs APIs over the governed workspace.chicagopulse namespace. A daily job refreshes and validates the pipeline.</desc>
  <style>
    .cp-card { fill: #ffffff; stroke: #d2d2d7; }
    .cp-node { fill: #fbfbfd; stroke: #d2d2d7; }
    .cp-node2 { fill: #f5f5f7; stroke: #d2d2d7; }
    .cp-accent-node { fill: #eeedfb; stroke: #c7c5f0; }
    .cp-target { fill: #e7e6fa; stroke: #5856d6; }
    .cp-title { fill: #3a3a3c; }
    .cp-label { fill: #1d1d1f; }
    .cp-sub { fill: #6e6e73; }
    .cp-line { stroke: #6e6e73; fill: none; }
    .cp-line-accent { stroke: #5856d6; fill: none; }
    .cp-arrow-fill { fill: #6e6e73; }
    .cp-arrow-accent-fill { fill: #5856d6; }
    .cp-dot { fill: #6e6e73; }
    .cp-sans { font-family: ui-sans-serif, system-ui, -apple-system, sans-serif; }
    .cp-mono { font-family: ui-monospace, SFMono-Regular, monospace; }
    :root[data-theme='dark'] .cp-card { fill: #000000; stroke: #2a2a2c; }
    :root[data-theme='dark'] .cp-node { fill: #0a0a0b; stroke: #2a2a2c; }
    :root[data-theme='dark'] .cp-node2 { fill: #1d1d1f; stroke: #2a2a2c; }
    :root[data-theme='dark'] .cp-accent-node { fill: #15151f; stroke: #3a3980; }
    :root[data-theme='dark'] .cp-target { fill: #1b1b33; stroke: #7d7aff; }
    :root[data-theme='dark'] .cp-title { fill: #c7c7cc; }
    :root[data-theme='dark'] .cp-label { fill: #f5f5f7; }
    :root[data-theme='dark'] .cp-sub { fill: #a1a1a6; }
    :root[data-theme='dark'] .cp-line { stroke: #a1a1a6; }
    :root[data-theme='dark'] .cp-line-accent { stroke: #7d7aff; }
    :root[data-theme='dark'] .cp-arrow-fill { fill: #a1a1a6; }
    :root[data-theme='dark'] .cp-arrow-accent-fill { fill: #7d7aff; }
    :root[data-theme='dark'] .cp-dot { fill: #a1a1a6; }
    @media (prefers-color-scheme: dark) {
      :root:not([data-theme='light']) .cp-card { fill: #000000; stroke: #2a2a2c; }
      :root:not([data-theme='light']) .cp-node { fill: #0a0a0b; stroke: #2a2a2c; }
      :root:not([data-theme='light']) .cp-node2 { fill: #1d1d1f; stroke: #2a2a2c; }
      :root:not([data-theme='light']) .cp-accent-node { fill: #15151f; stroke: #3a3980; }
      :root:not([data-theme='light']) .cp-target { fill: #1b1b33; stroke: #7d7aff; }
      :root:not([data-theme='light']) .cp-title { fill: #c7c7cc; }
      :root:not([data-theme='light']) .cp-label { fill: #f5f5f7; }
      :root:not([data-theme='light']) .cp-sub { fill: #a1a1a6; }
      :root:not([data-theme='light']) .cp-line { stroke: #a1a1a6; }
      :root:not([data-theme='light']) .cp-line-accent { stroke: #7d7aff; }
      :root:not([data-theme='light']) .cp-arrow-fill { fill: #a1a1a6; }
      :root:not([data-theme='light']) .cp-arrow-accent-fill { fill: #7d7aff; }
      :root:not([data-theme='light']) .cp-dot { fill: #a1a1a6; }
    }
  </style>
  <defs>
    <marker id="cp-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" class="cp-arrow-fill"/></marker>
    <marker id="cp-arrow-accent" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" class="cp-arrow-accent-fill"/></marker>
  </defs>
  <rect x="8" y="8" width="704" height="614" rx="14" class="cp-card" stroke-width="1"/>
  <text x="360" y="40" text-anchor="middle" class="cp-sans cp-title" font-size="15" font-weight="650">ChicagoPulse architecture</text>
  <rect x="235" y="64" width="250" height="40" rx="20" class="cp-accent-node" stroke-width="1"/>
  <text x="360" y="89" text-anchor="middle" class="cp-mono cp-label" font-size="12" font-weight="600">City of Chicago Socrata APIs</text>
  <path d="M 360 104 L 360 128 L 130 128 L 130 150" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <rect x="42" y="150" width="176" height="54" rx="10" class="cp-node" stroke-width="1"/>
  <text x="130" y="181" text-anchor="middle" class="cp-sans cp-label" font-size="13" font-weight="600">Bronze</text>
  <text x="130" y="197" text-anchor="middle" class="cp-mono cp-sub" font-size="11">ingestion</text>
  <rect x="272" y="150" width="176" height="54" rx="10" class="cp-node" stroke-width="1"/>
  <text x="360" y="181" text-anchor="middle" class="cp-sans cp-label" font-size="13" font-weight="600">Silver</text>
  <text x="360" y="197" text-anchor="middle" class="cp-mono cp-sub" font-size="11">transformations</text>
  <rect x="502" y="150" width="176" height="54" rx="10" class="cp-node" stroke-width="1"/>
  <text x="590" y="181" text-anchor="middle" class="cp-sans cp-label" font-size="13" font-weight="600">Gold</text>
  <text x="590" y="197" text-anchor="middle" class="cp-mono cp-sub" font-size="11">semantic tables</text>
  <line x1="218" y1="177" x2="272" y2="177" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <line x1="448" y1="177" x2="502" y2="177" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <path d="M 590 204 L 590 227 L 430 227 L 430 250" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <rect x="335" y="250" width="190" height="54" rx="10" class="cp-node2" stroke-width="1"/>
  <text x="430" y="276" text-anchor="middle" class="cp-sans cp-label" font-size="13" font-weight="650">Unity Catalog</text>
  <text x="430" y="292" text-anchor="middle" class="cp-mono cp-sub" font-size="11">Metric Views</text>
  <line x1="430" y1="304" x2="430" y2="350" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <rect x="62" y="350" width="175" height="48" rx="10" class="cp-node" stroke-width="1"/>
  <text x="149" y="379" text-anchor="middle" class="cp-sans cp-label" font-size="12" font-weight="600">React + TypeScript</text>
  <rect x="340" y="350" width="180" height="48" rx="10" class="cp-accent-node" stroke-width="1"/>
  <text x="430" y="371" text-anchor="middle" class="cp-sans cp-label" font-size="12" font-weight="600">FastAPI</text>
  <text x="430" y="387" text-anchor="middle" class="cp-mono cp-sub" font-size="11">same-origin /api/*</text>
  <line x1="237" y1="374" x2="340" y2="374" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <path d="M 430 398 L 430 420" class="cp-line" stroke-width="1.5"/>
  <line x1="122" y1="420" x2="599" y2="420" class="cp-line" stroke-width="1.5"/>
  <line x1="122" y1="420" x2="122" y2="444" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <line x1="281" y1="420" x2="281" y2="444" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <line x1="440" y1="420" x2="440" y2="444" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <line x1="599" y1="420" x2="599" y2="444" class="cp-line" stroke-width="1.5" marker-end="url(#cp-arrow)"/>
  <rect x="67" y="444" width="110" height="38" rx="8" class="cp-node" stroke-width="1"/>
  <text x="122" y="467" text-anchor="middle" class="cp-sans cp-label" font-size="11">Jobs API</text>
  <rect x="206" y="444" width="150" height="38" rx="8" class="cp-node" stroke-width="1"/>
  <text x="281" y="467" text-anchor="middle" class="cp-sans cp-label" font-size="11">Genie Conversation</text>
  <rect x="375" y="444" width="130" height="38" rx="8" class="cp-node" stroke-width="1"/>
  <text x="440" y="467" text-anchor="middle" class="cp-sans cp-label" font-size="11">Genie Feedback</text>
  <rect x="529" y="444" width="140" height="38" rx="8" class="cp-node" stroke-width="1"/>
  <text x="599" y="467" text-anchor="middle" class="cp-sans cp-label" font-size="11">SQL Warehouse</text>
  <line x1="122" y1="482" x2="122" y2="504" class="cp-line" stroke-width="1.5"/>
  <line x1="281" y1="482" x2="281" y2="504" class="cp-line" stroke-width="1.5"/>
  <line x1="440" y1="482" x2="440" y2="504" class="cp-line" stroke-width="1.5"/>
  <line x1="599" y1="482" x2="599" y2="504" class="cp-line" stroke-width="1.5"/>
  <line x1="122" y1="504" x2="599" y2="504" class="cp-line" stroke-width="1.5"/>
  <line x1="360" y1="504" x2="360" y2="528" class="cp-line-accent" stroke-width="1.5" marker-end="url(#cp-arrow-accent)"/>
  <rect x="245" y="528" width="230" height="44" rx="10" class="cp-target" stroke-width="1.5"/>
  <text x="360" y="555" text-anchor="middle" class="cp-mono cp-label" font-size="13" font-weight="650">workspace.chicagopulse</text>
  <path d="M 67 463 L 34 463 L 34 177 L 42 177" class="cp-line" stroke-width="1.5" stroke-dasharray="4 4" marker-end="url(#cp-arrow)"/>
  <text transform="rotate(-90 21 320)" x="21" y="320" text-anchor="middle" class="cp-sans cp-sub" font-size="10">Daily refresh + validation</text>
  <text x="360" y="598" text-anchor="middle" class="cp-sans cp-sub" font-size="11">React + TypeScript, FastAPI, Genie, SQL Warehouse, and Jobs API all run as one Databricks App</text>
</svg>
<p>The data layer is more than a collection of uploaded CSV files. Fifteen notebooks cover setup, Bronze ingestion, Silver transformations, Gold metrics, spatial enrichment, semantic-base construction, Unity Catalog Metric Views, incremental refresh, and validation. The daily workflow has explicit ingestion, transformation, and validation stages.</p>
<p>That separation matters. Genie should reason over defined business measures, not infer metric semantics from raw operational columns on every question. ChicagoPulse Metric Views expose measures such as total 311 requests, open building violations, permit fees, and month-over-month change with governed dimensions for month and Community Area.</p>
<p>The app then binds three Databricks resources at deployment time: a Genie space, a SQL Warehouse, and the daily refresh job. It authenticates as a dedicated app service principal instead of putting a personal token or resource credential in browser code.</p>
<h2 id="why-the-browser-cannot-send-arbitrary-sql"><span class="sec-num" aria-hidden="true">04</span>Why the browser cannot send arbitrary SQL</h2>
<p>One of my most important choices was to make ChicagoPulse deliberately less flexible.</p>
<p>Genie owns the natural-language analytical conversation inside its governed space. The app's other data endpoints, such as neighborhood maps, comparisons, and Data Health, do <strong>not</strong> accept arbitrary SQL from the browser. FastAPI maps those requests to allowlisted, parameterized query templates. Resource selection also stays on the server, so a client cannot choose a different Genie space, warehouse, job, notebook path, or set of job parameters.</p>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th>Approach</th>
<th>Flexibility</th>
<th>Risk and operational cost</th>
</tr>
</thead>
<tbody>
<tr>
<td>Browser submits arbitrary SQL</td>
<td>Highest</td>
<td>Expands the query and authorization surface; harder to validate and govern</td>
</tr>
<tr>
<td>Backend accepts user-selected resources</td>
<td>High</td>
<td>Lets clients reach unintended spaces, warehouses, or jobs unless every path is verified</td>
</tr>
<tr>
<td>Allowlisted server templates</td>
<td>Lower</td>
<td>Predictable query shapes, bounded parameters, testable API contracts</td>
</tr>
<tr>
<td>Governed Genie space for NLQ</td>
<td>Focused</td>
<td>Flexible questions within configured data, instructions, semantics, and permissions</td>
</tr>
</tbody>
</table></div></div>
<p>The trade-off is real. A user cannot turn the neighborhood endpoint into a general-purpose analytics API. I accepted that constraint because the route has a specific product job. It should return a neighborhood pulse, not execute whatever SQL arrives over HTTP.</p>
<p>This split also made the public API simpler. Raw Databricks payloads and state messages are normalized before they reach the browser. Empty, failed, cancelled, and expired Genie messages become explicit application states. Upstream errors do not leak credentials or internal payloads.</p>
<h2 id="a-30-question-benchmark-keeps-genie-changes-honest"><span class="sec-num" aria-hidden="true">05</span>A 30-question benchmark keeps Genie changes honest</h2>
<p>A polished demo question proves very little. It usually proves that someone tested the demo question.</p>
<p>ChicagoPulse has a <strong>30-question Genie benchmark</strong> with verified SQL. The questions are grouped across six categories:</p>
<ul>
<li>basic metrics;</li>
<li>neighborhood comparisons;</li>
<li>311 drilldowns;</li>
<li>time trends;</li>
<li>cross-dataset reasoning; and</li>
<li>freshness and coverage.</li>
</ul>
<p>The suite ranges from straightforward prompts such as "How many 311 requests were recorded across Chicago in the last completed month?" to cross-dataset questions such as identifying Community Areas where 311 requests and building violations both rose by more than 10 percent.</p>
<p>The benchmark is part of the maintenance loop. Answer feedback does not automatically retrain Genie or mutate its instructions. Instead, maintainers review recurring feedback, verify proposed corrections against governed data, turn proven patterns into instructions or verified SQL examples, and run the benchmark before and after the change.</p>
<p>That process is slower than feeding every negative rating directly back into the system. It is also auditable. User feedback is evidence to investigate, not ground truth by default.</p>
<h2 id="data-health-makes-trust-visible"><span class="sec-num" aria-hidden="true">06</span>Data Health makes trust visible</h2>
<p>Many data products display a recent timestamp and call the pipeline healthy. ChicagoPulse does not infer end-to-end success from <code>MAX(_ingested_at)</code>.</p>
<p>An ingestion timestamp answers one question: when did records last arrive? It does not prove that transformations completed, Gold tables were rebuilt, semantic views remained valid, or quality checks passed. Data Health therefore separates <strong>source freshness</strong> from <strong>pipeline success</strong>.</p>
<p>The surface shows the last successful refresh, latest completed reporting month, source coverage, row counts, ingestion timestamps, and links back to the official City datasets. A maintainer can explicitly start the one bound refresh job after a confirmation step, then inspect the real Jobs API state for ingestion, transformation, and validation. The interface never fabricates progress.</p>
<p>Two smaller display rules prevent surprisingly large analytical errors:</p>
<ul>
<li>Neighborhood metrics use only <strong>fully completed calendar months</strong>, so a partial current month is not compared with a full prior month.</li>
<li>Missing source coverage renders as <strong>N/A</strong>, not zero. Zero is a measured result; unavailable means the app does not have enough evidence to make that claim.</li>
</ul>
<p>These details are not visually dramatic. They are the details that determine whether someone misreads the chart.</p>
<h2 id="the-hardest-problems-were-semantic-spatial-and-operational"><span class="sec-num" aria-hidden="true">07</span>The hardest problems were semantic, spatial, and operational</h2>
<p>The chat interface was not the hardest part of ChicagoPulse.</p>
<p><strong>Time semantics were harder than they looked.</strong> "Latest" is ambiguous when a source is updated during the current month. I standardized the product on the latest completed month for neighborhood metrics and made the reporting period visible.</p>
<p><strong>Geography needed explicit enrichment.</strong> City records do not all arrive with equally usable Community Area fields. The pipeline includes official Community Area boundaries and spatial enrichment for building violations so that neighborhood comparisons share a common geographic vocabulary.</p>
<p><strong>Genie is asynchronous.</strong> A conversation response can be pending, complete, empty, failed, cancelled, or expired. The FastAPI layer normalizes those states so the React app has a stable contract instead of coupling every component to upstream response shapes.</p>
<p><strong>Free Edition forced useful discipline.</strong> The production snapshot runs on Databricks Apps Free Edition, where access to the live app may require permission in the connected Databricks account. That constraint reinforced the need for deterministic mock providers, local lifecycle testing, and a production fail-closed rule that refuses to start when mock mode is enabled.</p>
<p>None of those choices appears in a screenshot of a successful answer. Together, they are most of the reason I trust the screenshot.</p>
<h2 id="what-chicagopulse-does-not-claim"><span class="sec-num" aria-hidden="true">08</span>What ChicagoPulse does not claim</h2>
<p>ChicagoPulse summarizes public administrative data for neighborhood-level exploration. It is not real-time, address-level, emergency, legal, or policy decision support. Source records can be revised by the City, and the live experience may require Databricks account permission.</p>
<p>The Data Health catalog identifies food inspections, crimes, traffic crashes, and affordable rental housing developments as possible future sources. They are visibly marked as future scope. They are not currently ingested, modeled, or available to Genie.</p>
<p>That distinction is intentional. A roadmap label must not look like current data coverage.</p>
<h2 id="what-winning-changed-for-me"><span class="sec-num" aria-hidden="true">09</span>What winning changed for me</h2>
<p>The contest result validated more than a UI or a single Genie response. It rewarded the whole path from source records to a governed semantic layer, from a natural-language question to inspectable SQL, and from an ingestion timestamp to evidence that a pipeline actually completed.</p>
<p>If I were starting again, I would define the benchmark categories and trust states before polishing the interface. Evaluation questions expose semantic gaps early. Explicit states expose product ambiguity early. Both are cheaper to address before users build expectations around the happy path.</p>
<p>I would also preserve the boundary between conversational flexibility and deterministic application queries. It is tempting to route every data interaction through one AI interface. ChicagoPulse is better because it does not. Genie handles open-ended questions over governed semantics; fixed product journeys use constrained APIs.</p>
<p>The Gold banner is the visible outcome. The reusable lesson is less glamorous: a Genie-powered app becomes credible when governance, evaluation, provenance, and operational truth are designed into the product from the start.</p>
<h2 id="try-chicagopulse-and-inspect-the-evidence"><span class="sec-num" aria-hidden="true">10</span>Try ChicagoPulse and inspect the evidence</h2>
<ul>
<li>Read the official <a href="https://community.databricks.com/t5/announcements/databricks-community-contest-winners-of-the-genie-powered-app/td-p/168246">Databricks Community winners announcement</a>.</li>
<li>Open <a href="https://chicagopulse-7474647819672339.aws.databricksapps.com">ChicagoPulse on Databricks Apps</a>. Access may require permission in the connected Databricks account.</li>
<li>Explore the four official City datasets linked above and compare their raw structure with the questions the app supports.</li>
<li>Review the <a href="https://github.com/bcastelino/genie-chicago-pulse">ChicagoPulse source code on GitHub</a> for the full React, FastAPI, and Databricks pipeline notebooks.</li>
<li>[Coming Soon: ChicagoPulse demo video URL.]</li>
</ul>
<p>If you are building with Databricks Genie, start your next design review below the chat box. Ask what defines each measure, which questions form the regression suite, what evidence a user can inspect, and how the interface distinguishes stale, missing, partial, and failed data. Those answers will matter long after the demo ends.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Extreme DAX, Second Edition: An Honest Review of the Advanced Power BI Playbook</title>
      <link>https://bcastelino.com/blogs/blog/extreme-dax-second-edition-review/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/extreme-dax-second-edition-review/</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>book-review</category>
      <category>power-bi</category>
      <description><![CDATA[An honest review of Extreme DAX, Second Edition by Michiel Rozema, Madzy Stikkelorum, and Henk Vlootman. Why this Packt book is a scenario playbook for advanced Power BI, not another DAX function reference.]]></description>
      <content:encoded><![CDATA[<p>Most DAX books are reference manuals. They march function by function, argument by argument, and leave you to figure out how the pieces fit a real problem. <em>Extreme DAX, Second Edition</em> does the opposite, and that is the whole point of it.</p>
<p>To be upfront: Packt sent me a reviewer copy, and I read it as someone who writes DAX for actual Power BI work, not as a first-timer. I recently built <a href="https://github.com/bcastelino/powerbi-dashboard-generator"><code>powerbi-dashboard-generator</code></a>, so I went in with specific scars and specific questions. This review is about how the book teaches, and whether the scenarios hold up when you sit down to build them.</p>
<p>The short version: this is the strongest advanced DAX resource I have read, precisely because it refuses to be a function reference. It is a book of hard problems, solved well.</p>
<div style="display:flex;flex-wrap:wrap;gap:1.75rem;align-items:center;margin:2rem 0;padding:1.5rem;border:1px solid var(--color-border);border-radius:16px;background:var(--color-fill-1);box-shadow:var(--shadow-card);">
<a href="https://www.amazon.com/dp/1836647638" target="_blank" rel="noopener" style="flex:0 0 auto;">
<img src="https://images-na.ssl-images-amazon.com/images/P/1836647638.01.L.jpg" alt="Cover of Extreme DAX, Second Edition by Michiel Rozema, Madzy Stikkelorum, and Henk Vlootman" width="160" style="display:block;width:160px;border-radius:10px;margin:0;box-shadow:var(--shadow-card);" />
</a>
<div style="flex:1;min-width:250px;">
<div style="display:flex;align-items:center;gap:.6rem;margin-bottom:.6rem;"><span style="position:relative;display:inline-block;font-size:1.25rem;letter-spacing:2px;line-height:1;"><span style="color:var(--color-text-muted);opacity:.35;">★★★★★</span><span style="position:absolute;top:0;left:0;width:90%;overflow:hidden;white-space:nowrap;color:var(--ios-orange);">★★★★★</span></span><strong style="font-size:1.05rem;">4.5 / 5</strong></div>
<p style="margin:0 0 1rem;"><strong>Quick verdict:</strong> <em>Extreme DAX, Second Edition</em> is a scenario playbook disguised as a DAX book. Its real subject is how experienced practitioners think through hard modeling problems. Best for intermediate-to-advanced analysts who are done with tutorials and stuck on the real thing.</p>
<div style="display:flex;flex-wrap:wrap;gap:1rem;font-size:.9rem;align-items:stretch;">
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Authors</span>Rozema, Stikkelorum, Vlootman</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Publisher</span>Packt (2026)</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Length</span>554 pages · 14 chapters</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Format</span>Book + PBIX repo</div>
</div>
</div>
</div>
<h2 id="what-is-extreme-dax-second-edition"><span class="sec-num" aria-hidden="true">01</span>What is Extreme DAX, Second Edition?</h2>
<p><em>Extreme DAX, Second Edition</em> is an advanced Power BI and DAX book (Packt, 2026) that teaches the language through 13 real business scenarios rather than a catalog of functions. It runs 554 pages across 14 chapters and is written by <a href="https://www.linkedin.com/in/michielrozema/">Michiel Rozema</a>, <a href="https://www.linkedin.com/in/madzygroenveld/">Madzy Stikkelorum</a>, and <a href="https://www.linkedin.com/in/vlootman/">Henk Vlootman</a>, with a foreword by <a href="https://www.linkedin.com/in/jeroenterheerdt/">Jeroen ter Heerdt</a>, who was DAX Product Manager for Power BI at Microsoft until March 2026.</p>
<p>The book assumes you already write DAX. It deliberately skips the "here is what SUM does" material, on the reasonable grounds that a search engine can tell you the arguments of a function. What it spends its pages on instead is the gap between knowing the functions and solving the problem: the modeling decisions, the context gymnastics, and the "why does the visual show this" moments that no function list prepares you for.</p>
<h2 id="the-thesis-procedural-learning-not-another-reference"><span class="sec-num" aria-hidden="true">02</span>The thesis: procedural learning, not another reference</h2>
<p>Jeroen ter Heerdt's foreword frames the book better than any blurb could, using a distinction from learning science: declarative learning (concepts, rules, theory) versus procedural learning (doing, practice, pattern, intuition). DAX has plenty of the former and very little of the latter.</p>
<div style="margin:1.5rem 0;padding:1.15rem 1.4rem;border-left:4px solid var(--color-accent);border-radius:0 12px 12px 0;background:var(--color-accent-soft);font-size:1.12rem;line-height:1.55;"><strong>The book is light on theory by design. Its weight is in curated, real-world scenarios, the kind you encounter in actual projects rather than contrived exercises.</strong></div>
<p>That is an accurate description of how it reads. In ter Heerdt's words, "reading it is close to the experience of looking over the shoulder of someone who has solved your exact problem before." That is exactly the resource that is hard to find, and it is why the scenario format works.</p>
<h2 id="why-the-structure-is-the-argument"><span class="sec-num" aria-hidden="true">03</span>Why the structure is the argument</h2>
<p>The book is built so the foundation carries the harder material, and that ordering is deliberate:</p>
<ul>
<li><strong>Chapters 1 to 4</strong> set the base: analyzing data with DAX, model design, using DAX, and the one that everything else leans on, context and filtering (row, query, and filter context, <code>CALCULATE</code>, table functions, and variables).</li>
<li><strong>Chapters 5 to 9</strong> are the first wave of real scenarios: security with DAX, dynamically changing visualizations, inventory analysis, alternative calendars, and working with Auto-Exist.</li>
<li><strong>Chapters 10 to 13</strong> are the deep end: recursion in DAX, DAX-driven waterfalls, benchmarking with window functions, and real-estate investment planning.</li>
</ul>
<p>Read that way, the "advanced" label is earned. Each scenario is a self-contained project with a business case, a model, and a worked solution, and most ship with a downloadable PBIX so you can open the file and see exactly how a measure behaves inside a visual.</p>
<h2 id="the-scenarios-that-stuck-with-me"><span class="sec-num" aria-hidden="true">04</span>The scenarios that stuck with me</h2>
<p>These are the chapters I expect to actually reach for, not just the ones that read well.</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:1rem;margin:1.5rem 0;">
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Security beyond row-level security.</strong><span style="color:var(--color-text-secondary);">Chapter 5 goes past standard RLS into object-level security and, more usefully, value-level security: dynamically hiding specific attribute values through modeling plus security filters. It also covers securing hierarchies with PATH functions and securing aggregation levels. This is the most complete treatment of DAX security I have seen in one place.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Field parameters for dynamic visuals.</strong><span style="color:var(--color-text-secondary);">Chapter 6 uses field parameters to let users swap measures, axes, and report titles at runtime, then is honest about where field parameters run out of road and you reach for control tables instead. This maps directly to problems I hit building dashboard tooling.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">The case of the missing workdays.</strong><span style="color:var(--color-text-secondary);">Chapter 9 explains Auto-Exist, the feature that quietly stops Power BI from evaluating measures for label combinations that do not exist, and then walks through a workday-on-workday comparison it silently breaks. The fix uses the WINDOW function and a COALESCE(WorkdayNum, 1) guard. It is the best "why is my visual wrong" chapter in the book.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Recursion, which DAX does not support.</strong><span style="color:var(--color-text-secondary);">Chapter 10 tackles inherently recursive warehousing logic (stock now depends on stock earlier, which depends on stock earlier still) and shows how user-defined functions make semi-recursive calculations possible. This is the clearest example of the second edition using new language features to solve an old, hard problem.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Waterfalls via visual calculations.</strong><span style="color:var(--color-text-secondary);">Chapter 11 builds dynamic waterfall charts with visual calculations, including showing and hiding parts of a visual and conditional formatting, then reuses the logic through user-defined functions. It is a good look at where visual calculations genuinely beat classic measures.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Goal-seeking for IRR.</strong><span style="color:var(--color-text-secondary);">Chapter 13 covers Future Value, Present Value, NPV, and Internal Rate of Return, then confronts the fact that IRR has no closed-form solution (the worked example lands at 2.59%). It uses XNPV and XIRR, and then goal-seeking with user-defined functions when the built-ins are not enough. Real numerical methods, in DAX.</span></div>
</div>
<p>The line from the preface that captures the second edition best is a quiet flex:</p>
<blockquote style="margin:1.75rem 0;padding:1.4rem 1.6rem;border-left:4px solid var(--color-accent);background:var(--color-fill-1);border-radius:0 14px 14px 0;font-style:italic;font-size:1.12rem;line-height:1.6;">"Many of the scenarios from the first edition of Extreme DAX can be, and should be, solved in another way. We can even go beyond to things that were practically impossible three years ago."</blockquote>
<h2 id="what-changed-from-the-first-edition"><span class="sec-num" aria-hidden="true">05</span>What changed from the first edition</h2>
<p>If you owned the 2022 edition, this is not a cover refresh. The problems are familiar, but the solutions are rebuilt around features that have landed since: field parameters, calculation groups, custom calendars, visual calculations, and user-defined functions. Several chapters that used to lean on awkward workarounds now have cleaner answers, and the recursion and waterfall chapters in particular exist because the language finally supports them well.</p>
<p>The framing changed too. DAX semantic models are now positioned as the center of the Microsoft Fabric platform rather than a Power BI feature, which is the right call for where the stack is heading.</p>
<h2 id="where-it-falls-short"><span class="sec-num" aria-hidden="true">06</span>Where it falls short</h2>
<p>No book earns a real review without the criticism, so here is mine.</p>
<p><strong>It is genuinely advanced, and it will lose beginners fast.</strong> The authors say plainly that they do not explain most functions and arguments, because you can find that online. That is the correct decision for the audience, but it means someone still learning <code>CALCULATE</code> will drown by Chapter 5. This is a second book, not a first.</p>
<p><strong>Some scenarios use preview features.</strong> The book notes that a few features were not generally available at the time of writing, so you may need to enable preview options to follow along. Useful now, but a reminder that the newest material is also the least stable.</p>
<p><strong>Depth over breadth cuts both ways.</strong> Because each chapter goes deep on one business case, the book is not a lookup you skim for a quick pattern. You get the most from it by building the PBIX alongside the text, which is a bigger time commitment than a reference.</p>
<p><strong>It is Power BI and Fabric specific.</strong> The modeling instincts transfer, but the solutions assume the Microsoft semantic model engine. If you work in another BI stack, the thinking helps and the code does not.</p>
<h2 id="how-extreme-dax-compares-to-other-dax-books"><span class="sec-num" aria-hidden="true">07</span>How Extreme DAX compares to other DAX books</h2>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th>Aspect</th>
<th>Extreme DAX, 2nd Ed</th>
<th>Typical DAX books</th>
</tr>
</thead>
<tbody>
<tr>
<td>Teaching approach</td>
<td>Scenario-first: 13 real business cases, solved end to end</td>
<td>Function-first: reference tour of syntax and arguments</td>
</tr>
<tr>
<td>Audience</td>
<td>Intermediate to advanced practitioners</td>
<td>Beginners to intermediate</td>
</tr>
<tr>
<td>Depth vs breadth</td>
<td>Deep on a focused set of hard problems</td>
<td>Broad coverage, shallower on any one problem</td>
</tr>
<tr>
<td>Companion material</td>
<td>PBIX file per chapter to build along</td>
<td>Often code snippets only</td>
</tr>
<tr>
<td>Currency</td>
<td>2026 features (field parameters, visual calculations, UDFs)</td>
<td>Frequently a version or two behind</td>
</tr>
</tbody>
</table></div></div>
<h2 id="how-it-connects-to-everything-else-i-have-read-and-built"><span class="sec-num" aria-hidden="true">08</span>How it connects to everything else I have read and built</h2>
<p>The most interesting thing about this book is not any single measure. It is a pattern I keep seeing across the tools I work with: the interesting work is moving out of the raw engine and into the layer of control, governance, and reusable logic wrapped around it.</p>
<p>DAX getting user-defined functions, recursion, and goal-seeking is the same move, in miniature, that AI agents make when they wrap a model in tools, memory, and verification. I wrote about that shift in my reviews of <a href="../principles-and-patterns-of-building-ai-agents-review/">Principles and Patterns of Building AI Agents</a> and <a href="../30-agents-every-ai-engineer-must-build-review/">30 Agents Every AI Engineer Must Build</a>: the value lives in the architecture around the primitive, not the primitive itself. Chapter 10's UDF-driven recursion reads like DAX growing the same procedural escape hatches.</p>
<p>The security chapter lands the same way against the platform trend. Value-level security, aggregation security, and the Fabric-centric framing are all about turning the semantic model into a governed layer that feeds both dashboards and, increasingly, AI. That is exactly the direction I traced in my <a href="../databricks-partner-well-architected-framework/">Databricks Well-Architected Framework</a> and <a href="../databricks-data-ai-summit-2026/">Databricks Data + AI Summit 2026</a> write-ups: both ecosystems are converging on a governed semantic and metrics layer as the source of truth. Reading Extreme DAX next to those, the Microsoft answer to that problem comes into focus.</p>
<p>And on the practitioner side, three chapters map straight onto problems I hit building <a href="https://github.com/bcastelino/powerbi-dashboard-generator"><code>powerbi-dashboard-generator</code></a>: field parameters for user-driven visuals (Chapter 6), Auto-Exist surprises when a visual quietly drops rows (Chapter 9), and calculation groups for keeping time intelligence sane across metrics (Chapter 8). Those are not academic examples. They are the exact places a real dashboard breaks.</p>
<h2 id="who-should-actually-read-it"><span class="sec-num" aria-hidden="true">09</span>Who should actually read it</h2>
<p>Read this if you already write DAX for a living, or close to it, and you keep hitting the wall between "I know the functions" and "I cannot make this specific thing work." Security beyond RLS, custom calendars, recursion, benchmarking, and financial modeling in DAX are all here, worked end to end.</p>
<p>Skip it, or shelve it for later, if you are still learning the basics. It will not hold your hand, and it is not trying to.</p>
<h2 id="final-word"><span class="sec-num" aria-hidden="true">10</span>Final word</h2>
<div style="display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin:1.5rem 0;padding:1.1rem 1.35rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);box-shadow:var(--shadow-card);"><span style="font-size:2.2rem;font-weight:700;letter-spacing:-.02em;line-height:1;">4.5<span style="font-size:1rem;color:var(--color-text-muted);font-weight:500;"> / 5</span></span><span style="position:relative;display:inline-block;font-size:1.3rem;letter-spacing:2px;line-height:1;"><span style="color:var(--color-text-muted);opacity:.35;">★★★★★</span><span style="position:absolute;top:0;left:0;width:90%;overflow:hidden;white-space:nowrap;color:var(--ios-orange);">★★★★★</span></span><span style="flex:1;min-width:200px;color:var(--color-text-secondary);">The best advanced DAX resource I have read, because it teaches the problems, not just the functions.</span></div>
<p><em>Extreme DAX, Second Edition</em> is a book of hard problems solved by people who have clearly solved them for real. The scenario format is the right one for advanced DAX, the second edition earns its update by rebuilding old solutions with new language features, and the PBIX-per-chapter approach means you can actually feel the difference between reading a pattern and running it. It loses half a point only for being genuinely inaccessible to beginners and leaning on a few preview features. <strong>4.5 / 5</strong>, and it is going on the shelf next to the reference I reach for when I am stuck.</p>
<p>Disclosure: Packt sent me a reviewer copy of this book. Thank you to <a href="https://www.linkedin.com/in/shruthis-shetty/">Shruthi Shetty</a> for reaching out and getting it to me, and a real thank you to <a href="https://www.linkedin.com/in/michielrozema/">Michiel Rozema</a>, <a href="https://www.linkedin.com/in/madzygroenveld/">Madzy Stikkelorum</a>, and <a href="https://www.linkedin.com/in/vlootman/">Henk Vlootman</a> for writing it, and to <a href="https://www.linkedin.com/in/jeroenterheerdt/">Jeroen ter Heerdt</a> for a foreword that framed the whole thing.</p>
<p>You can find the book on <a href="https://www.amazon.com/dp/1836647638">Amazon</a> and via <a href="https://www.packtpub.com/">Packt</a>, and the companion Power BI files on <a href="https://github.com/PacktPublishing/Extreme-DAX-Second-Edition">GitHub</a>. If you read it, I would like to know which scenario you built first.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Databricks Partner Well Architected Framework: How to Actually Build and Submit a Solution With It</title>
      <link>https://bcastelino.com/blogs/blog/databricks-partner-well-architected-framework/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/databricks-partner-well-architected-framework/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>databricks</category>
      <category>data-engineering</category>
      <category>open-source</category>
      <description><![CDATA[A practical guide to the Databricks Partner Well Architected Framework (PWAF): the three partner tracks, the four pillars, the four deployment models, and the deployment-model decision that quietly determines what program benefits you can ever earn.]]></description>
      <content:encoded><![CDATA[<p>Most partner-facing frameworks are documentation you skim once and never open again. The Databricks Partner Well Architected Framework is not that, because it contains one decision that silently determines everything downstream: which deployment model your product uses. Get that wrong and you can build a technically excellent solution that is structurally incapable of earning the partner benefits you built it for.</p>
<p>I found this out the practical way. I used the PWAF to design and submit a Databricks solution accelerator for WorldLink, and the framework was genuinely useful, but the most valuable thing in it was not a pattern or a diagram. It was a single sentence buried in the Customer Managed deployment page.</p>
<p>This post is the guide I wanted when I started: what the PWAF is, which of the three partner tracks you belong to, what the four pillars actually demand, how to choose between the four deployment models, and which requirements are hard gates versus suggestions.</p>
<div style="margin:2rem 0;padding:1.5rem;border:1px solid var(--color-border);border-radius:16px;background:var(--color-fill-1);box-shadow:var(--shadow-card);">
<div style="display:flex;flex-wrap:wrap;gap:1.75rem;align-items:center;">
<a href="https://www.credential.net/4133c666-6e3d-4584-8eeb-4a199ee6d517" target="_blank" rel="noopener noreferrer" style="flex:0 0 auto;">
<img src="/blogs/posts/pwaf-badge.png" alt="Databricks Academy badge: Partner Training, ISV Partner Well Architected Frameworks" width="230" style="display:block;width:230px;border-radius:10px;margin:0;" />
</a>
<div style="flex:1;min-width:250px;">
<p style="margin:0 0 1rem;font-size:.95rem;font-style:italic;color:var(--color-text-secondary);">"This badge is awarded to people who complete the ISV Partner Well Architected Frameworks Training and Knowledge Check with a score of 80% or higher. This course is designed to teach ISVs the basic knowledge of Partner Well Architected Frameworks, as well as give you the main resources and tools for building solutions utilizing PWAF."</p>
<div style="display:flex;flex-wrap:wrap;gap:.4rem;">
<span style="font-size:.78rem;padding:.25rem .6rem;border-radius:999px;background:var(--color-accent-soft);color:var(--color-text-secondary);">Partner Well Architected Frameworks</span>
<span style="font-size:.78rem;padding:.25rem .6rem;border-radius:999px;background:var(--color-accent-soft);color:var(--color-text-secondary);">Solution Development</span>
<span style="font-size:.78rem;padding:.25rem .6rem;border-radius:999px;background:var(--color-accent-soft);color:var(--color-text-secondary);">Knowledge Check Assessment</span>
<span style="font-size:.78rem;padding:.25rem .6rem;border-radius:999px;background:var(--color-accent-soft);color:var(--color-text-secondary);">ISV Partnership Skills</span>
<span style="font-size:.78rem;padding:.25rem .6rem;border-radius:999px;background:var(--color-accent-soft);color:var(--color-text-secondary);">Resource Utilization</span>
</div>
<p style="margin:1rem 0 0;"><a href="https://www.credential.net/4133c666-6e3d-4584-8eeb-4a199ee6d517" target="_blank" rel="noopener noreferrer" style="display:inline-flex;align-items:center;gap:.45rem;padding:.4rem .9rem;border-radius:999px;border:1px solid color-mix(in oklab, var(--color-accent) 25%, transparent);background:var(--color-accent-soft);font-size:.82rem;font-weight:600;color:var(--color-accent);text-decoration:none;"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="var(--color-accent)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex-shrink:0;"><circle cx="12" cy="12" r="10"/><path d="m8.5 12.5 2.5 2.5 4.5-5.5"/></svg>Verify this credential</a></p>
</div>
</div>
<div style="display:flex;flex-wrap:wrap;gap:1rem;font-size:.9rem;align-items:stretch;margin-top:1.5rem;padding-top:1.25rem;border-top:1px solid var(--color-border);">
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Issuer</span>Databricks Academy</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Credential</span>Partner Training, ISV Partner Well Architected Frameworks</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Issued</span>July 31, 2026</div>
</div>
</div>
<div style="margin:2rem 0;padding:1.25rem 1.5rem;border:1px solid var(--takeaway-border,var(--color-border));border-radius:16px;background:var(--takeaway-tint,var(--color-fill-1));display:flex;flex-wrap:wrap;gap:.75rem 1.5rem;align-items:center;justify-content:space-between;">
<div style="flex:1;min-width:260px;">
<span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.12em;color:var(--color-text-muted);margin-bottom:.35rem;">Live artifact</span>
<span style="font-size:1rem;font-weight:600;color:var(--color-text-primary);">The accelerator this post describes is the Semantic Model Migration Accelerator, submitted under the PWAF and published by WorldLink US.</span>
</div>
<a href="https://worldlink-us.ai/partners/databricks/semantic-model-migration" target="_blank" rel="noopener noreferrer" style="flex:0 0 auto;display:inline-flex;align-items:center;padding:.55rem 1.15rem;border-radius:999px;border:1px solid var(--color-border);background:var(--color-fill-2,var(--color-fill-1));font-size:.92rem;font-weight:600;color:var(--color-text-primary);text-decoration:none;">View the accelerator</a>
</div>
<p>The training is worth the hour, but it teaches you the map, not the terrain. What follows is the terrain.</p>
<h2 id="what-is-the-databricks-partner-well-architected-framework"><span class="sec-num" aria-hidden="true">01</span>What is the Databricks Partner Well Architected Framework?</h2>
<p><strong>The Partner Well Architected Framework (PWAF) is Databricks' architecture guide for technology partners building products, integrations, and data shares on the Databricks Data Intelligence Platform.</strong> It is published by Databricks Labs at <a href="https://databrickslabs.github.io/partner-architecture/">databrickslabs.github.io/partner-architecture</a> and organized around three partner types and four architectural pillars.</p>
<p>The framing matters. Databricks explicitly positions the PWAF as an extension of the cloud Well Architected Frameworks (AWS, Azure, GCP) and the <a href="https://docs.databricks.com/aws/en/lakehouse-architecture/">Databricks Lakehouse Architecture</a>, applied to problems those frameworks do not cover: multi-tenant SaaS architectures, customer data integration, marketplace distribution, and partner attribution.</p>
<p>That last one, attribution, is the tell. The cloud frameworks care whether your system is reliable and secure. The PWAF also cares whether Databricks can <em>see</em> your product working, because partner economics depend on measurable joint impact. Read the whole framework through that lens and a lot of otherwise-arbitrary requirements start making sense.</p>
<p>One practical note before you start: the PWAF is deliberately built for AI-assisted development. Every page has a copy-link action and an AI assistant dropdown with pre-loaded prompts, and the site publishes two machine-readable context files, an <code>llms.txt</code> site map and an <code>ai-context.txt</code> guidance file. If you are going to work through the framework with Claude or Cursor, point the tool at those files first instead of pasting pages one at a time.</p>
<h2 id="who-the-pwaf-is-for-the-three-partner-tracks"><span class="sec-num" aria-hidden="true">02</span>Who the PWAF is for: the three partner tracks</h2>
<p>Before reading anything else, work out which track you are in, because the technical standards differ per track and you will waste time reading requirements that do not apply to you.</p>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th>Track</th>
<th>You are here if</th>
<th>Core technical concerns</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Connected ISV Partner</strong></td>
<td>You have an existing product (BI, ingestion, governance, AI tooling) and you are connecting it to Databricks</td>
<td>OAuth, SQL drivers and SDKs, Unity Catalog registration, <code>User-Agent</code> telemetry, Genie attribution</td>
</tr>
<tr>
<td><strong>Data Collaboration Partner</strong></td>
<td>You are sharing or monetizing data privately or through Databricks Marketplace</td>
<td>OpenSharing, Unity Catalog layout, metadata quality, recipients, Change Data Feed</td>
</tr>
<tr>
<td><strong>Built-On ISV Partner</strong></td>
<td>Databricks <em>is</em> your backend, and your customers may never know it</td>
<td>Deployment models, multi-tenancy, workspace models, credential isolation, cost management</td>
</tr>
</tbody>
</table></div></div>
<p>The boundaries blur in practice. A notebook-based solution accelerator that a customer runs in their own workspace is closest to the Built-On track under the Customer Managed deployment model, even though it feels nothing like a SaaS product. That mismatch is worth thinking about early, and I will come back to it.</p>
<p>One thing the PWAF is clear about: the framework is technical guidance, not membership. To get go-to-market benefits, co-sell, and program incentives you have to be an active member of the <a href="https://partners.databricks.com/">Databricks Partner Program</a>, and validation requests go through the Partner Portal. Building well and being a partner are separate steps, in that order or not.</p>
<h2 id="the-four-pwaf-pillars-and-which-ones-actually-gate-you"><span class="sec-num" aria-hidden="true">03</span>The four PWAF pillars, and which ones actually gate you</h2>
<p>Databricks defines four pillars:</p>
<ol>
<li><strong>Architectural Best Practices.</strong> Design principles, repeatable patterns, reference architectures, and implementation guidance.</li>
<li><strong>Defined Technical Standards.</strong> Per-partner-type requirements that must be met for validation and program participation, with a stated path to validation.</li>
<li><strong>Measurement and Attribution.</strong> Continuous measurement of adoption and impact, and partner attribution through telemetry.</li>
<li><strong>Operations and Lifecycle Management.</strong> Monitoring, automation, runbooks, access management, and continuous improvement workflows.</li>
</ol>
<p>Here is the part nobody tells you: engineers spend roughly all of their effort on pillar 1 and almost none on pillar 3, and pillar 3 is closer to a gate.</p>
<p>Pillar 1 is fun. It is diagrams, patterns, and design debates. It is also where you have the most latitude, because "good architecture" has many valid shapes.</p>
<p>Pillars 2 and 3 are checklists with binary outcomes. Did you embed a programmatic <code>User-Agent</code>? Did you register your data assets in Unity Catalog? Is OAuth implemented, or are you still passing personal access tokens around? These are yes-or-no, and they are cheap to do early and expensive to retrofit.</p>
<p>Pillar 4 is the one that gets deferred to "after we ship," which is why so many partner solutions have no runbook, no documented upgrade path, and no support boundary. The Customer Managed guidance is blunt about this: define clear boundaries for support, provide clear versioning for all artifacts, document upgrade paths and breaking changes, and consider backward compatibility for long-term customers. That is a pillar-4 to-do list, and it takes a day.</p>
<h2 id="connected-isv-the-requirements-that-are-genuinely-mandatory"><span class="sec-num" aria-hidden="true">04</span>Connected ISV: the requirements that are genuinely mandatory</h2>
<p>If you are connecting an existing product to Databricks, the <a href="https://databrickslabs.github.io/partner-architecture/isv-partners/integration-requirements">integration requirements</a> page is the highest-value page in the entire framework. It is short and it is specific. These are the hard requirements.</p>
<h3 id="oauth-20-is-mandatory-and-personal-access-tokens-are-not-a-strategy">OAuth 2.0 is mandatory, and personal access tokens are not a strategy</h3>
<p>OAuth is mandatory for all ISV partner integrations and is the standard mechanism for secure production authentication. Two flows are supported:</p>
<ul>
<li><strong>User-to-machine (U2M).</strong> A browser-based OAuth flow where the user authenticates with their own identity and your app acts on their behalf. Relevant docs cover JDBC, ODBC, OIDC U2M, and token federation.</li>
<li><strong>Machine-to-machine (M2M).</strong> Client credentials with service principals, so jobs, services, and scripts reach Databricks with no signed-in user. This covers Workload Identity Federation, account token federation, and Databricks OIDC M2M.</li>
</ul>
<p>The security and lifecycle guidance is standard but worth quoting as a checklist, because reviewers will look for it: request least-privilege scopes, persist tokens securely, rotate refresh tokens, use PKCE, never log tokens and ensure redaction, support revocation, and provide a clear disconnect and re-auth experience.</p>
<p>That last item is the one I see skipped most. Plenty of integrations can connect. Far fewer can cleanly <em>disconnect</em>.</p>
<h3 id="unity-catalog-registration-is-not-optional-if-you-touch-data">Unity Catalog registration is not optional if you touch data</h3>
<p>The rule is broad: if an ISV integration reads, writes, stages, or manages any type of data asset, the integration must register and operate on those assets in Unity Catalog. "Data asset" is defined widely too, covering structured and tabular data (tables, views, materialized views, metric views, UDFs), unstructured files (images, documents, logs, binaries, ingestion files), and ML models.</p>
<p>Practically, this means three-level namespacing (<code>&#x3C;catalog>.&#x3C;schema>.&#x3C;table></code>) everywhere, no side-channel storage that bypasses governance, and metadata access that complies with the <a href="https://www.databricks.com/legal/acceptable-use-policy">Databricks Acceptable Use Policy</a>.</p>
<h3 id="telemetry-one-string-programmatically-set-verifiable-in-a-system-table">Telemetry: one string, programmatically set, verifiable in a system table</h3>
<p>This is the requirement that most directly serves the Measurement and Attribution pillar, and it is a small amount of work with outsized consequences.</p>
<p>You must programmatically embed a stable partner <code>User-Agent</code> identifier in every Databricks API call, driver or SQL connection, SDK or connector call, job, CLI invocation, or other integration request originating from your product. The format is built from <code>isv-name</code>, <code>product-name</code>, and <code>product-version</code>, separated by underscores. Each product or integration needs a distinct value.</p>
<p>Two details matter more than the format:</p>
<p><strong>You cannot outsource it to the customer.</strong> The framework says it plainly: partners must set this value programmatically in the connection code path, and you cannot rely on joint customers to configure it themselves. It calls this a strict requirement.</p>
<p><strong>You can verify it yourself.</strong> The Source column in <a href="https://docs.databricks.com/aws/en/sql/user/queries/query-history">Query History</a> reflects the <code>User-Agent</code> used by the partner application, and for full coverage across workloads you query the audit system table:</p>
<pre><code class="language-sql">SELECT *
FROM system.access.audit
WHERE event_time > current_timestamp() - INTERVAL 2 days
  AND lower(user_agent) LIKE '%&#x3C;your-user-agent>%';
</code></pre>
<p>Run that before you submit anything. If it returns nothing, your attribution does not exist, whatever your architecture diagram says.</p>
<h3 id="genie-attribution-has-specific-ui-requirements">Genie attribution has specific UI requirements</h3>
<p>If your product surfaces Genie output, four things are required: a visible "Powered by Genie" label wherever Genie-generated content appears, a citation linking directly to the Genie Space that produced the result (constructible from the <code>space_id</code> returned by the Genie API), any links in the Genie response surfaced and navigable, and the same attribution in product surfaces like settings or integration dialogs and in your documentation.</p>
<p>And a hard one for AI products: agent products must invoke Genie via MCP, and agent workflows that do not use the Genie MCP will not be validated. If you built an agent that talks to Databricks through a bespoke SQL path, that is a rewrite, not a tweak.</p>
<h3 id="documentation-is-a-deliverable-not-an-afterthought">Documentation is a deliverable, not an afterthought</h3>
<p>Partners must provide written documentation that lets a customer connect the product to Databricks, and the framework specifies its contents: prerequisites, the Databricks privileges the connecting user or service principal needs, which authentication types are supported, and step-by-step setup for each supported auth type. PDF is accepted at submission, live docs on your site are preferred.</p>
<p>I would go further and write this document <em>first</em>. It forces you to answer "what privileges do we actually need" before you have hard-coded an over-privileged service principal into a demo.</p>
<h3 id="product-categories-change-the-specifics">Product categories change the specifics</h3>
<p>Beyond the common requirements, the framework splits Connected ISV guidance into five product categories: Data Engineering and Ingestion, AI Agents and Tools, Business Intelligence, Governance and Observability, and Apps and Dev Tools. Find your category and read its page, because category-specific best practices are additive to the shared requirements, not a substitute.</p>
<h2 id="data-collaboration-productizing-data-instead-of-shipping-software"><span class="sec-num" aria-hidden="true">05</span>Data Collaboration: productizing data instead of shipping software</h2>
<p>The Data Collaboration track assumes your data already exists in Databricks and is registered in Unity Catalog. It does not cover upstream ingestion or ETL, which is a useful scoping decision.</p>
<p>Sharing breaks into named patterns:</p>
<div class="table-wrap is-wide" data-cols="4"><div class="table-scroll"><table>
<thead>
<tr>
<th>Pattern</th>
<th>Direction</th>
<th>Auth</th>
<th>Best for</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>D2D</strong> (Databricks-to-Databricks)</td>
<td>Outbound</td>
<td>Sharing identifier, no token exchange</td>
<td>Customers already on Databricks; richest feature set, all asset types including volumes, notebooks, and models</td>
</tr>
<tr>
<td><strong>D2O</strong> (Databricks-to-Open)</td>
<td>Outbound</td>
<td>Bearer tokens or OIDC federation</td>
<td>External platforms, non-Databricks recipients, broad distribution</td>
</tr>
<tr>
<td><strong>O2D</strong> (Open-to-Databricks)</td>
<td>Inbound</td>
<td>Lakeflow Connectors and other ingestion</td>
<td>Consuming data from external providers</td>
</tr>
<tr>
<td><strong>Bi-directional</strong></td>
<td>Both</td>
<td>Combination</td>
<td>Data exchanges, hub-and-spoke architectures</td>
</tr>
</tbody>
</table></div></div>
<p>The engineering advice in this track is less about protocols and more about making data usable, and it lands on metadata. Unity Catalog lets you attach table and column descriptions, tags, business terms, and relationships, and the framework ties this directly to AI readiness: when Genie can read complete and accurate metadata, users can query and explore your data in natural language.</p>
<p>That is a real incentive change. Metadata used to be documentation hygiene you did for humans who mostly ignored it. Now it is the interface that determines whether natural-language querying works on your data product. If you share a table with cryptic column names and no descriptions, you have shipped a dataset that AI tooling cannot use well, and your consumers will notice.</p>
<p>Two more operational notes worth acting on: enable <a href="https://docs.databricks.com/aws/en/delta/delta-change-data-feed">Change Data Feed</a> where incremental reads and automation matter, and plan schema evolution and backward compatibility so your updates do not break consumer workloads. A shared table is an API. Breaking changes behave like breaking changes.</p>
<h2 id="built-on-isv-the-five-layer-application-architecture"><span class="sec-num" aria-hidden="true">06</span>Built-On ISV: the five-layer application architecture</h2>
<p>If Databricks is your backend, the framework expects a specific application shape. For most Built-On products you build an application that sits between your end users and the platform, in five layers:</p>
<pre><code class="language-text">1. Client Layer        Browser frontend (React, Angular, Vue), renders UI,
                       makes authenticated API requests
2. Authentication      OAuth 2.0 / OIDC with your identity provider,
                       user auth and session management
3. Backend Layer       Server-side API routes, validates sessions, manages
                       tokens, proxies ALL Databricks API calls
4. Data Layer          Application database (PostgreSQL, MySQL): users,
                       organizations, encrypted credentials
5. Databricks          Unity Catalog, SQL Warehouses, DBFS, Jobs, and other
                       services via REST APIs
</code></pre>
<p>The design goal is stated explicitly: Databricks credentials never reach the client, authentication boundaries are clear, and each layer scales independently.</p>
<p>The load-bearing word there is "all." Every Databricks call is proxied through your backend. It sounds obvious written down, and it is the first thing that gets violated when someone wants a fast dashboard and calls the SQL Warehouse straight from the browser with a token in local storage. If you take one structural rule from the Built-On track, take that one.</p>
<p>Layer 4 is the one people under-plan. You need somewhere to store users, organizations, and encrypted customer credentials, which means you are running an application database alongside Databricks and inheriting all the key-management responsibility that comes with storing customer credentials at rest.</p>
<h2 id="how-to-choose-a-databricks-deployment-model"><span class="sec-num" aria-hidden="true">07</span>How to choose a Databricks deployment model</h2>
<p>This is the decision the rest of your architecture hangs off. Databricks documents four models.</p>
<div class="table-wrap is-wide" data-cols="4"><div class="table-scroll"><table>
<thead>
<tr>
<th>Model</th>
<th>Who owns the Databricks environment</th>
<th>What the partner operates</th>
<th>Distinguishing mechanism</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Partner Hosted (SaaS)</strong></td>
<td>Partner owns workspaces, compute, storage, pipelines</td>
<td>Everything; customers need no Databricks account</td>
<td>Databricks powers the backend and stays invisible to end users</td>
</tr>
<tr>
<td><strong>Hybrid</strong></td>
<td>Partner-managed control plane, customer-owned data plane</td>
<td>Control plane; customer owns where data lives</td>
<td>Customer-managed VPC (AWS, GCP) or Azure Managed Applications</td>
</tr>
<tr>
<td><strong>Side Car</strong></td>
<td>Partner builds and governs assets centrally in its own workspace</td>
<td>Asset quality, versioning, IP</td>
<td>OpenSharing plus Clean Rooms deliver governed assets to customer environments</td>
</tr>
<tr>
<td><strong>Customer Managed</strong></td>
<td>Customer owns workspace, infrastructure, and data</td>
<td>Nothing at runtime; partner ships software, templates, guidance</td>
<td>Notebooks, Databricks Asset Bundles, Terraform modules, Python packages</td>
</tr>
</tbody>
</table></div></div>
<p>The framework gives five selection criteria, and they are good questions in the order they are asked:</p>
<ol>
<li><strong>Data residency.</strong> Does the customer's data need to stay in their environment?</li>
<li><strong>Operational capacity.</strong> Do you want to manage infrastructure, or does the customer prefer to?</li>
<li><strong>Customer sophistication.</strong> Does the customer have a platform team capable of managing Databricks?</li>
<li><strong>Regulatory constraints.</strong> Do compliance requirements dictate where data can reside?</li>
<li><strong>Scale and economics.</strong> Which model gives you the best unit economics?</li>
</ol>
<p>Databricks also notes that many partners offer more than one model, typically Partner Hosted for customers who want simplicity and Hybrid for enterprise customers with data residency or compliance requirements. Treat the models as a product-line decision, not a one-time architectural choice.</p>
<p>Side Car deserves a closer look because it is the least familiar of the four. Partners build and govern assets centrally, then deliver them into customer environments via OpenSharing and Clean Rooms, keeping control of asset quality, versioning, and IP while the customer keeps authority over their data and execution environment. Customers can consume shared datasets from non-Databricks systems and run compute wherever they like, while Databricks centralizes policy enforcement and asset governance. If your value is <em>the asset</em> rather than <em>the application</em>, this is the model to read twice.</p>
<h2 id="the-deployment-model-trap-customer-managed-limits-your-program-benefits"><span class="sec-num" aria-hidden="true">08</span>The deployment model trap: Customer Managed limits your program benefits</h2>
<p>Here is the sentence I mentioned at the top. On the <a href="https://databrickslabs.github.io/partner-architecture/built-on/deployment-models/customer-managed">Customer Managed</a> page, Databricks states:</p>
<blockquote>
<p>Due to limitations in telemetry and application management, program benefits are limited for Customer Managed deployments.</p>
</blockquote>
<p>Sit with that for a second, because it connects two things that look unrelated.</p>
<p>The Measurement and Attribution pillar exists so Databricks can observe adoption and attribute joint impact to you. Customer Managed means the customer owns the workspace, the infrastructure, and the runtime. You ship notebooks, Databricks Asset Bundles, Terraform modules, or Python packages, and then you are not in the execution path. There is no product of yours making tagged API calls, because the customer's own workspace is making them.</p>
<p>So the model with the lowest operational burden for you is also the model where attribution is weakest, and attribution is what partner benefits are built on. That is not a hidden penalty, it is a structural consequence, and Databricks documents it.</p>
<p>Now consider what most consulting-built solution accelerators look like. A repo of notebooks, a job definition, a config file, a deployment guide. The customer clones it and runs it in their workspace. That is Customer Managed, by default, without anyone having chosen it.</p>
<p>If you are building an accelerator and you want program benefits, you have three honest options:</p>
<ul>
<li><strong>Accept the tradeoff.</strong> Build Customer Managed because it fits the buyer, and treat the accelerator as a services differentiator and credibility asset rather than a route to partner benefits.</li>
<li><strong>Move up a model.</strong> Wrap the same logic in a Partner Hosted or Hybrid application so there is a product in the execution path that can carry a <code>User-Agent</code> and be managed and versioned by you.</li>
<li><strong>Go Side Car.</strong> If the output is a governed asset (a metric view, a curated dataset, a model), deliver it via OpenSharing so you keep central control of quality and versioning while the customer keeps their data.</li>
</ul>
<p>What you should not do is build Customer Managed by accident and then be surprised when the attribution story is thin. I would have made a different architectural choice at the start if I had read that page before designing rather than during.</p>
<h2 id="firefly-analytics-read-the-reference-implementation-not-just-the-prose"><span class="sec-num" aria-hidden="true">09</span>Firefly Analytics: read the reference implementation, not just the prose</h2>
<p>The single most useful resource attached to the PWAF is <a href="https://databrickslabs.github.io/partner-architecture/built-on/firefly">Firefly Analytics</a>, an open-source SaaS application published by Databricks Labs specifically as a PWAF reference implementation. Source is at <a href="https://github.com/databrickslabs/firefly">github.com/databrickslabs/firefly</a>, it runs live at <a href="https://www.firefly-analytics.com/">firefly-analytics.com</a>, and the architecture docs are at <a href="https://www.firefly-analytics.com/docs/architecture/overview">firefly-analytics.com/docs</a>.</p>
<p>Its stack is documented rather than implied:</p>
<ul>
<li><strong>Frontend:</strong> Next.js 15, React 19, TypeScript, Tailwind CSS, shadcn/ui, TanStack Query</li>
<li><strong>Backend:</strong> Next.js API routes, PostgreSQL with Drizzle ORM, Better-Auth</li>
<li><strong>Databricks:</strong> Unity Catalog, SQL Warehouses, DBFS, Volumes, Databricks Apps</li>
<li><strong>Deployment:</strong> Vercel for the frontend, Docker, VM, or serverless for the proxy</li>
</ul>
<p>The patterns it demonstrates map one-to-one onto the framework's abstract guidance: SSO-SPN authentication, Databricks identity handling, workspace-catalog binding for tenant isolation, application-tier auto-scaling, hybrid tenancy, and organization and user onboarding. It also demonstrates six things Built-On partners commonly build, including embedded Databricks Apps via a proxy, notebook and code and SQL editors, a data catalog, and a pipeline editor.</p>
<p>Two ways to use it that are better than reading it start to finish:</p>
<p><strong>As a diff target.</strong> Pick the one pattern you are least sure about, credential isolation between tenants, say, and read only Firefly's implementation of it. Compare against yours. The gap is your work item.</p>
<p><strong>As AI context.</strong> The framework explicitly suggests pointing AI tools at Firefly's source, which carries inline comments explaining PWAF principles in context. Combined with the <code>llms.txt</code> and <code>ai-context.txt</code> files, you can ask concrete questions ("how does Firefly bind an organization to a catalog?") and get answers grounded in working code instead of paraphrased docs.</p>
<p>Do not deploy it as your product. It is a reference implementation provided for learning, with no support commitment beyond documentation and your Databricks partner team.</p>
<h2 id="field-notes-mapping-a-real-accelerator-onto-the-pwaf"><span class="sec-num" aria-hidden="true">10</span>Field notes: mapping a real accelerator onto the PWAF</h2>
<p>Abstract frameworks get concrete when you run something through them. Here is the accelerator I built at WorldLink US, the <a href="https://worldlink-us.ai/partners/databricks/semantic-model-migration">Semantic Model Migration Accelerator</a>, described the way the PWAF would want it described.</p>
<p><strong>What it does.</strong> Converts Power BI semantic models exported as TMDL into governed Unity Catalog metric views, with deterministic DAX-to-SQL translation, flagged-measure review bundles, and KPI parity validation against the Power BI baseline.</p>
<p><strong>The pipeline.</strong> Five stages: parse <code>.tmdl</code> files for tables, measures, relationships, and partition sources; translate using configurable DAX-to-SQL, format string, and relationship mapping rules; generate metric view YAML plus model summaries and review bundles; deploy by registering metric views as Unity Catalog objects through the SQL Statement Execution API; validate by comparing KPI results against the Power BI baseline and producing reviewer-ready quality reports.</p>
<p><strong>The numbers.</strong> A moderately complex model takes an engineer 2 to 3 days by hand. Automated conversion runs in under 2 minutes per model. Conservative time savings are 60 to 80 percent versus manual conversion, with internal benchmarks reaching over 95 percent on supported star-schema models. The repo carries 156+ automated tests passing in CI, 23 sample TMDL packs across topologies, and a reference workload migrating 12 measures.</p>
<p>Now the honest PWAF mapping, pillar by pillar.</p>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th>Pillar</th>
<th>How the accelerator scored</th>
<th>What I would change</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Architectural Best Practices</strong></td>
<td>Strong. Databricks-native throughout: Workflows and Jobs for orchestration, notebooks for the pipeline, Delta Lake as source of truth, Unity Catalog metric views as governed output, Genie and Databricks SQL as consumers.</td>
<td>Little. This is the pillar that is fun and the pillar I over-invested in.</td>
</tr>
<tr>
<td><strong>Defined Technical Standards</strong></td>
<td>Mostly met. Unity Catalog registration is the whole point of the output. Premium or Enterprise workspace, UC enabled, and a SQL Warehouse are documented prerequisites.</td>
<td>Auth was workspace-native rather than a designed OAuth story, because the customer runs it. Under a productized model that becomes a real requirement.</td>
</tr>
<tr>
<td><strong>Measurement and Attribution</strong></td>
<td>Weak, structurally. Notebook-first execution in the customer's workspace means there is no partner product in the call path to carry a <code>User-Agent</code>.</td>
<td>This is the one to fix first, and fixing it means changing the deployment model, not adding a config field.</td>
</tr>
<tr>
<td><strong>Operations and Lifecycle</strong></td>
<td>Decent. A repeatable 5-phase delivery framework (Discovery 3 days, Mapping 2, Migration 3, Validation 2, Enablement 1) with runbook, CI/CD, and knowledge transfer handed over at the end.</td>
<td>Version and upgrade documentation for the artifacts themselves, distinct from the engagement runbook.</td>
</tr>
</tbody>
</table></div></div>
<p>Two things I would keep exactly as they are.</p>
<p><strong>The explicit non-goals.</strong> The accelerator documents what requires additional scope as loudly as what works: Power BI Import-mode models (data must be materialized as Delta first), calculation groups and many-to-many relationships (roadmap), row-level security (reapplied directly in Unity Catalog), and composite models (only DirectQuery portions migrate automatically). Naming the boundary is a credibility feature. Reviewers and customers both trust a scoped tool more than a tool that claims everything.</p>
<p><strong>Determinism as the supported path.</strong> Optional, bounded Mosaic AI review handles edge cases, but the production path stays deterministic. For a migration tool where the deliverable is numerical parity with an existing report, "the LLM will figure it out" is not a validation story. Parity is measurable, and a >95 percent parity target is a claim you can be held to.</p>
<p>The thing I got wrong was upstream of all of this: I designed a genuinely good Customer Managed solution without registering that Customer Managed is where program benefits are thinnest. The architecture was not the problem. The model selection was made implicitly by the delivery format.</p>
<h2 id="how-to-get-started-with-the-pwaf"><span class="sec-num" aria-hidden="true">11</span>How to get started with the PWAF</h2>
<p>In the order that avoids rework:</p>
<ol>
<li><strong>Join the Databricks Partner Program.</strong> The framework is public, but co-sell, go-to-market benefits, and validation submissions require active membership via the <a href="https://partners.databricks.com/">Partner Portal</a>.</li>
<li><strong>Take the ISV PWAF training.</strong> It is short, and it gives you the vocabulary and the resource map. The knowledge check needs 80 percent or higher.</li>
<li><strong>Identify your track.</strong> Connected ISV, Data Collaboration, or Built-On. Read your track's requirements page in full before designing anything.</li>
<li><strong>Choose your deployment model explicitly, and write down why.</strong> Use the five criteria. Record the decision with its tradeoffs, including the Customer Managed benefits limitation if that is where you land.</li>
<li><strong>Implement the hard requirements first.</strong> OAuth, Unity Catalog registration, and the programmatic <code>User-Agent</code>. These are cheap now and expensive later.</li>
<li><strong>Verify attribution with a query, not a hope.</strong> Run the <code>system.access.audit</code> check above and confirm your <code>User-Agent</code> shows up.</li>
<li><strong>Read Firefly for the pattern you are least sure about.</strong> Diff its implementation against yours.</li>
<li><strong>Write the customer connection documentation.</strong> Prerequisites, required Databricks privileges, supported auth types, step-by-step setup per auth type.</li>
<li><strong>Produce the pillar-4 artifacts.</strong> Runbook, support boundary, versioning scheme, upgrade path, breaking-change notes.</li>
<li><strong>Ask for architectural review before you submit.</strong> Partner Engineering takes technical questions through a Partner Support request in the Partner Portal. Use that earlier than feels necessary.</li>
</ol>
<h2 id="pwaf-best-practices-and-the-mistakes-that-cost-the-most"><span class="sec-num" aria-hidden="true">12</span>PWAF best practices, and the mistakes that cost the most</h2>
<p><strong>Choose the deployment model before the tech stack.</strong> It determines your attribution ceiling, your operational burden, and which program benefits are even available. Deciding it implicitly through delivery format is the single most expensive mistake in this whole process.</p>
<p><strong>Treat technical standards as acceptance criteria.</strong> OAuth, Unity Catalog, <code>User-Agent</code>, Genie attribution, MCP for agents. Put them in your definition of done, not your backlog.</p>
<p><strong>Instrument attribution on day one.</strong> It is one string in your connection code path. Retrofitting it across every driver, SDK call, job, and CLI invocation later is tedious and easy to do incompletely.</p>
<p><strong>Do not let customers configure your telemetry.</strong> The framework prohibits it, and even if it did not, customer-configured telemetry is telemetry you do not have.</p>
<p><strong>Define the ideal customer profile and the explicit non-goals.</strong> A tool that says "star-schema models with SUM, DISTINCTCOUNT, DIVIDE, AVERAGEX, and time intelligence" is more trustworthy than one that says "any semantic model."</p>
<p><strong>Make quality measurable.</strong> Parity percentages, test counts, benchmark workloads. "Significantly faster" is not a claim; "under 2 minutes per model versus 2 to 3 days manually" is.</p>
<p><strong>Write the docs before the demo.</strong> Documenting required privileges first prevents you from quietly building on an over-privileged service principal.</p>
<p><strong>Build a demo that works on someone else's data.</strong> Bundled reference workloads and multiple sample topologies exist for exactly this reason. A demo that only runs on your dataset is a video, not a solution.</p>
<p><strong>Keep AI on the optional path when correctness is the deliverable.</strong> Deterministic core, bounded AI assist for edge cases, clearly labelled. This is easier to validate and easier to defend.</p>
<p><strong>Plan for schema evolution if you share data.</strong> A shared table is an API contract, and CDF plus backward compatibility planning is how you avoid breaking consumers.</p>
<h2 id="sources"><span class="sec-num" aria-hidden="true">13</span>Sources</h2>
<p>Everything in this post is drawn from the official framework. If you only open three of these, make them the integration requirements, the deployment models overview, and the Customer Managed page.</p>
<div class="table-wrap" data-cols="2"><div class="table-scroll"><table>
<thead>
<tr>
<th>Resource</th>
<th>What it covers</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/">PWAF home</a></td>
<td>Entry point and the three partner tracks</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/intro">Introduction and pillars</a></td>
<td>The four pillars, relationship to cloud WAFs, partner program requirement</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/isv-partners/integration-requirements">Integration requirements</a></td>
<td>Mandatory OAuth, Unity Catalog, telemetry, Genie attribution, MCP, docs</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/isv-partners/integration-patterns">Integration patterns</a></td>
<td>ODBC, JDBC, Node.js, Golang drivers, SDKs, CLI and DABs, REST APIs</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/isv-partners/telemetry-attribution">Telemetry and attribution</a></td>
<td><code>User-Agent</code> format rules and how to verify with Query History and audit tables</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/isv-partners/product-categories">Product categories</a></td>
<td>Category-specific requirements for data engineering, AI, BI, governance, apps</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/data-collaboration">Data collaboration</a></td>
<td>Scope and prerequisites for data providers</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/data-collaboration/sharing-patterns">Sharing patterns</a></td>
<td>D2D, D2O, O2D, and bi-directional sharing</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/data-collaboration/data-products">Data as a product</a></td>
<td>Unity Catalog layout, metadata and AI readiness, Change Data Feed</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/built-on/deployment-models">Deployment models</a></td>
<td>The four models, five selection criteria, five-layer app architecture</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/built-on/deployment-models/customer-managed">Customer Managed</a></td>
<td>What partners provide, packaging, support boundaries, benefits limitation</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/built-on/deployment-models/side-car">Side Car</a></td>
<td>OpenSharing and Clean Rooms federated delivery, cost model</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/built-on/firefly">Firefly Analytics</a></td>
<td>Patterns demonstrated, tech stack, how to get started</td>
</tr>
<tr>
<td><a href="https://github.com/databrickslabs/firefly">Firefly source</a></td>
<td>Working implementation you can read and diff against</td>
</tr>
<tr>
<td><a href="https://www.firefly-analytics.com/docs/architecture/overview">Firefly architecture docs</a></td>
<td>Per-layer responsibilities, security, scalability, request flow</td>
</tr>
<tr>
<td><a href="https://databrickslabs.github.io/partner-architecture/ai-ready">AI-ready documentation</a></td>
<td><code>llms.txt</code> and <code>ai-context.txt</code> files and AI-assisted workflows</td>
</tr>
<tr>
<td><a href="https://partners.databricks.com/">Databricks Partner Portal</a></td>
<td>Program application, validation submissions, Partner Support</td>
</tr>
<tr>
<td><a href="https://www.credential.net/4133c666-6e3d-4584-8eeb-4a199ee6d517">ISV PWAF training credential</a></td>
<td>Verification for the badge above</td>
</tr>
</tbody>
</table></div></div>
<h2 id="related-reading"><span class="sec-num" aria-hidden="true">14</span>Related reading</h2>
<p>If you want the platform context these partner patterns sit on top of, my breakdown of <a href="../databricks-data-ai-summit-2026/">Databricks Data + AI Summit 2026</a> covers Genie, Unity Catalog semantics, and metric views in depth, which is most of what the PWAF assumes you already understand.</p>
<p>If you are building an accelerator right now, do one thing before you write more code: open the deployment models page, pick your model deliberately, and write down the tradeoff you are accepting. That paragraph is worth more than the next week of implementation.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Principles and Patterns of Building AI Agents: An Honest Review of Mastra&apos;s Free Two-Book Series</title>
      <link>https://bcastelino.com/blogs/blog/principles-and-patterns-of-building-ai-agents-review/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/principles-and-patterns-of-building-ai-agents-review/</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>book-review</category>
      <category>ai-engineering</category>
      <description><![CDATA[A grounded review of Sam Bhagwat's two free Mastra books, Principles of Building AI Agents and Patterns for Building AI Agents. Principles teaches what to build; Patterns teaches how to keep it alive in production.]]></description>
      <content:encoded><![CDATA[<p>Most books about AI agents land in one of two piles: 500-page reference tomes you never finish, or blog posts stretched into an ebook. Sam Bhagwat's two Mastra books are neither. <strong>Principles of Building AI Agents</strong> and its companion <strong>Patterns for Building AI Agents</strong>, both free downloads from <a href="https://mastra.ai/book">mastra.ai/book</a>, are short enough to read in a weekend and dense enough to keep on your desk. Together they trace the full arc from your first working agent to one that survives real users, and this review covers both.</p>
<p>To be upfront about what this review is: I read both cover to cover as an engineer trying to keep a mental model current, not as someone who shipped a Mastra app to production. So I am reviewing the <em>ideas and the teaching</em>, not the framework's runtime. That distinction matters, and I will come back to it.</p>
<p>The short version: this is one series in two volumes, and reading them as a pair is the point. <strong>Principles</strong> tells you <em>what</em> to build. <strong>Patterns</strong> tells you <em>how</em> to keep it alive once real users touch it.</p>
<div style="display:flex;flex-wrap:wrap;gap:1.75rem;align-items:stretch;margin:2rem 0;padding:1.5rem;border:1px solid var(--color-border);border-radius:16px;background:var(--color-fill-1);box-shadow:var(--shadow-card);">
<a href="https://mastra.ai/books/principles-of-building-ai-agents" target="_blank" rel="noopener" style="flex:0 0 auto;">
<img src="https://images-na.ssl-images-amazon.com/images/P/B0DYB2QCS7.01.L.jpg" alt="Cover of Principles of Building AI Agents by Sam Bhagwat" width="140" height="210" style="display:block;width:140px;height:210px;object-fit:cover;object-position:center;border-radius:10px;margin:0;box-shadow:var(--shadow-card);" />
</a>
<a href="https://mastra.ai/books/patterns-of-building-ai-agents" target="_blank" rel="noopener" style="flex:0 0 auto;">
<img src="https://images-na.ssl-images-amazon.com/images/P/B0G1XV9FQK.01.L.jpg" alt="Cover of Patterns for Building AI Agents by Sam Bhagwat and Michelle Gienow" width="140" height="210" style="display:block;width:140px;height:210px;object-fit:cover;object-position:center;border-radius:10px;margin:0;box-shadow:var(--shadow-card);" />
</a>
<div style="flex:1;min-width:250px;">
<div style="display:flex;align-items:center;gap:.6rem;margin-bottom:.6rem;"><span style="position:relative;display:inline-block;font-size:1.25rem;letter-spacing:2px;line-height:1;"><span style="color:var(--color-text-muted);opacity:.35;">★★★★★</span><span style="position:absolute;top:0;left:0;width:85%;overflow:hidden;white-space:nowrap;color:var(--ios-orange);">★★★★★</span></span><strong style="font-size:1.05rem;">4.25 / 5 as a series</strong></div>
<p style="margin:0 0 1rem;"><strong>Quick verdict:</strong> The most efficient on-ramp to agent engineering I have read. <em>Principles</em> (4 / 5) is a fast, honest primer. <em>Patterns</em> (4.5 / 5) is the one you will keep on your desk, because it is about the messy middle between a demo and production.</p>
</div>
<div style="flex:1 1 100%;display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:1rem 1.5rem;font-size:.92rem;line-height:1.45;border-top:1px solid var(--color-border);padding-top:1.35rem;">
<div style="display:flex;flex-direction:column;gap:.25rem;"><span style="color:var(--color-text-muted);font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;">Authors</span><span style="color:var(--color-text-secondary);">Sam Bhagwat and Michelle Gienow</span></div>
<div style="display:flex;flex-direction:column;gap:.25rem;"><span style="color:var(--color-text-muted);font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;">Publisher</span><span style="color:var(--color-text-secondary);">Self-published, 2025 to 2026</span></div>
<div style="display:flex;flex-direction:column;gap:.25rem;"><span style="color:var(--color-text-muted);font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;">Length</span><span style="color:var(--color-text-secondary);">134 + 92 pages</span></div>
<div style="display:flex;flex-direction:column;gap:.25rem;"><span style="color:var(--color-text-muted);font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;">Price</span><span style="color:var(--color-text-secondary);">Free digital, paid print</span></div>
</div>
</div>
<h2 id="what-are-principles-and-patterns-of-building-ai-agents"><span class="sec-num" aria-hidden="true">01</span>What are Principles and Patterns of Building AI Agents?</h2>
<p><strong>Principles of Building AI Agents</strong> is a short, conceptual guide to modern agents, now in its 3rd edition (March 2026). It runs about 134 pages across 33 chapters and ten parts: prompting an LLM, building an agent, tools and MCP, graph-based workflows, RAG, multi-agent systems, observability and evals, development and deployment, coding agents, and a grab-bag "everything else" on multimodal. It is deliberately pocket-sized.</p>
<p><strong>Patterns for Building AI Agents</strong> is Volume 2 (October 2025), co-written with Michelle Gienow. It is roughly 92 pages of 22 numbered patterns grouped into four working parts: configure your agents, engineer agent context, evaluate agent responses, and secure your agents. Where Principles is textbook, Patterns is a collection of lessons learned from teams pushing agents into production.</p>
<p>Both are written by Sam Bhagwat, CEO of <a href="https://mastra.ai/">Mastra</a>, the open-source TypeScript agent framework, and previously a co-founder of the Gatsby React framework. Both are free.</p>
<h2 id="the-thesis-what-to-build-then-how-to-build"><span class="sec-num" aria-hidden="true">02</span>The thesis: what to build, then how to build</h2>
<p>Bhagwat states the relationship between the two books plainly, and it is the most useful framing in either one:</p>
<div style="margin:1.5rem 0;padding:1.15rem 1.4rem;border-left:4px solid var(--color-accent);border-radius:0 12px 12px 0;background:var(--color-accent-soft);font-size:1.12rem;line-height:1.55;"><strong>Principles covered what to build. Patterns covers how to build. Principles will get you through the first few weeks; Patterns should be on your desk until its contents are imprinted in your mind.</strong></div>
<p>That is not marketing filler. It is an accurate description of how the two books actually feel to read. Principles gets you fluent. Patterns is where the scar tissue lives.</p>
<h2 id="principles-a-primer-that-respects-your-time"><span class="sec-num" aria-hidden="true">03</span>Principles: a primer that respects your time</h2>
<p>The best decision in Principles is its length. Bhagwat says in the foreword that it "should fit in your back pocket," and that you should be able to get something working in a day or two. He keeps that promise. There is no throat-clearing.</p>
<p>A few things it does genuinely well:</p>
<p><strong>It anchors on a clean definition.</strong> It borrows Simon Willison's line that an agent "calls tools in a loop to achieve a goal," then lays agency out as a spectrum, from binary choices in a decision tree, to memory and retries, up to planning, subtask decomposition, and self-correction across long horizons. That ladder is a better mental model than the usual "agents are magic" hand-waving.</p>
<p><strong>It has a spine of engineering judgment.</strong> The line I kept coming back to is "make it work, make it right, make it fast/cheap, in that order." It shows up when choosing a provider, when picking model size, and when deciding whether to move workloads to cheaper open models later. It is the kind of advice that sounds obvious and that people ignore constantly.</p>
<p><strong>Tool design gets the emphasis it deserves.</strong> The chapter on tool calling argues that designing your tools is the single most important step, and it should happen on paper before you write code. The illustration, investor Alana Goyal's book-recommendation agent, is a clean before-and-after: dumping every book into the context window failed, and breaking the problem into specific tools ("get books by genre," "get recommendations by investor") made the agent behave like a real analyst. Think like an analyst, then write each operation as a tool.</p>
<p><strong>Memory is treated as a design choice.</strong> Principles names three memory types (working memory, semantic recall, and observational memory) and spends real pages on observational memory, where an "observer agent" compresses raw sessions into structured observations and a "reflector agent" garbage-collects when they overflow. That is a more honest picture of production memory than "just stuff it in the context window."</p>
<p>Where Principles is weakest is the flip side of its virtue: it is thin. Some chapters are two pages. If you already build agents, several sections will feel like a table of contents with commentary. That is a fair trade for a free primer, but it is why I score it a notch below its sequel.</p>
<h2 id="patterns-the-half-worth-paying-for-even-though-it-is-free"><span class="sec-num" aria-hidden="true">04</span>Patterns: the half worth paying for (even though it is free)</h2>
<p>Patterns is the one I would hand to a team about to ship. It is organized as problem, then solution, then a real example, and the examples are specific enough to be useful rather than decorative. Three parts stood out.</p>
<h3 id="context-engineering-treated-as-its-own-discipline">Context engineering, treated as its own discipline</h3>
<p>The context section is the clearest short treatment of context engineering I have read. It names five concrete failure modes rather than waving at "the model got confused":</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1rem;margin:1.5rem 0;">
<div style="padding:1.05rem 1.2rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.4rem;">Context poisoning</strong><span style="color:var(--color-text-secondary);">A hallucination gets into context and is referenced again and again.</span></div>
<div style="padding:1.05rem 1.2rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.4rem;">Context distraction</strong><span style="color:var(--color-text-secondary);">Context grows so long the model over-focuses on it and discounts its training.</span></div>
<div style="padding:1.05rem 1.2rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.4rem;">Context confusion</strong><span style="color:var(--color-text-secondary);">Irrelevant material drags the response quality down.</span></div>
<div style="padding:1.05rem 1.2rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.4rem;">Context clash</strong><span style="color:var(--color-text-secondary);">New information contradicts something already in the prompt.</span></div>
<div style="padding:1.05rem 1.2rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.4rem;">Context rot</strong><span style="color:var(--color-text-secondary);">Around 100k tokens, even long-context models start losing the signal in the noise.</span></div>
</div>
<p>The example that sells it: a Google Gemini team benchmarking a Pokemon-playing agent watched accuracy start degrading around 125k tokens, even with a 500k-token window. By filtering with RAG, pruning irrelevant context, and assembling a compiled context string before every call, they took a research agent from 34% to reliably over 90% accuracy. The book's blunt summary is that "context is not free," and every token influences behavior for better or worse.</p>
<h3 id="evals-as-engineering-not-vibes">Evals as engineering, not vibes</h3>
<p>The evals part is built around a recurring, believable case study: a medical necessity-review agent for health insurers, whose north-star metric is "false approvals." The workflow it lays out is the honest version of quality work: list your failure modes and <em>why</em> they happen, connect engineering metrics to a business metric, cross-reference the two, then iterate against a benchmark in CI so a fix "here" does not silently break something "there."</p>
<p>The pattern I found most quietly important is "Have SMEs Label Data." The argument is that software engineers are not your domain experts, so they should not be the ones judging whether a medical approval was correct. Outsourcing annotation breaks the loop between seeing a failure and understanding it. That is a governance point disguised as a labeling tip.</p>
<blockquote style="margin:1.75rem 0;padding:1.4rem 1.6rem;border-left:4px solid var(--color-accent);background:var(--color-fill-1);border-radius:0 14px 14px 0;font-style:italic;font-size:1.12rem;line-height:1.6;">"Benchmarks are the difference between engineering and experimentation."</blockquote>
<h3 id="security-written-for-the-way-agents-actually-break">Security, written for the way agents actually break</h3>
<p>The security part opens with the right observation: traditional security assumes humans click buttons and code runs deterministically, and agents break both assumptions by interpreting instructions from anywhere and acting across systems.</p>
<p>Its centerpiece is Simon Willison's "lethal trifecta": access to private data, exposure to untrusted content, and the ability to communicate externally. Combine all three and a prompt-injection attack can read your secrets and exfiltrate them. The GitHub MCP server is the worked example, and it covers the whole trifecta at once. The practical advice is to remove one leg, usually the exfiltration path, via input processors. The rest of the part is equally grounded: sandbox untrusted code (with fast-start runtimes like E2B or Daytona, since a Docker cold start is too slow), grant granular just-in-time access rather than broad roles, and add real-time guardrails on both inputs and outputs.</p>
<h2 id="the-patterns-that-stuck-with-me"><span class="sec-num" aria-hidden="true">05</span>The patterns that stuck with me</h2>
<p>These are the ideas I expect to actually reuse, pulled from across both books.</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:1rem;margin:1.5rem 0;">
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Design agents like an org chart.</strong><span style="color:var(--color-text-secondary);">Patterns opens by treating agent design as organizational design: write down every capability, group by data source and task type, then split into agents. It is the same "divide and conquer" instinct as normal software, applied before you over-build a mega-agent that chooses the wrong tool.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Discover the architecture, do not pre-plan it.</strong><span style="color:var(--color-text-secondary);">Build the one burning agent well, watch what users ask for next, split when it gets unwieldy, add routing when you have several. The content-creation example (coordinator to router to specialists) earns the lesson: you never build a mediocre master agent.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Parallelize carefully.</strong><span style="color:var(--color-text-secondary);">The Temple Run example is a great warning: two subagents working in isolation produced a runner and a stop-and-think path system that could not be combined. Sometimes a single-threaded linear agent is the more reliable architecture.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Feed errors back into context.</strong><span style="color:var(--color-text-secondary);">Good agents examine and correct their own errors instead of crashing. Give the agent the error message, let it fix and re-run, and if you see a recurring error, put it in the prompt. It is how Cursor, Cascade, and Replit already behave.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Human-in-the-loop is a design axis.</strong><span style="color:var(--color-text-secondary);">In-the-loop, post-processing review, or deferred execution: the book frames HITL as three distinct injection points chosen by risk, and honestly notes that humans then become the bottleneck since agents do not sleep.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Dynamic agents over version sprawl.</strong><span style="color:var(--color-text-secondary);">Rather than maintaining an agent per user tier, let one agent adapt its prompt, tools, memory, and model at runtime from signals like user role. More power, more testing burden; the book is clear about both.</span></div>
</div>
<h2 id="where-the-series-falls-short"><span class="sec-num" aria-hidden="true">06</span>Where the series falls short</h2>
<p>No book earns a real review without the criticism, so here is mine.</p>
<p><strong>Breadth beats depth, and Principles feels it most.</strong> This is the same complaint you will find on Goodreads, and it is fair. Principles skims. It is a wide, shallow tour by design, so anyone hoping to <em>master</em> RAG or multi-agent orchestration from it will be disappointed. It is a map, not the territory.</p>
<p><strong>It is Mastra's book, and it shows.</strong> The concepts are portable, but the code and several APIs are Mastra-specific and TypeScript-first. That is reasonable for a free book from a framework company, and the plugs are examples rather than hard sells, but Python engineers should know the snippets will not copy-paste.</p>
<p><strong>The stack will age faster than the ideas.</strong> Both books name specific models, token thresholds, and tools. Useful now, dated in eighteen months. The durable parts are the distinctions: single-threaded versus parallel, generation versus verification, autonomy versus guardrails.</p>
<p><strong>Patterns is a field guide, not a manual.</strong> At 92 pages it is dense and original, but each pattern is a strong sketch, not an end-to-end implementation. You will still need docs and code to actually ship any one of them.</p>
<h2 id="how-the-two-books-compare"><span class="sec-num" aria-hidden="true">07</span>How the two books compare</h2>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th></th>
<th>Principles (Vol 1)</th>
<th>Patterns (Vol 2)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Purpose</td>
<td>What to build</td>
<td>How to build in production</td>
</tr>
<tr>
<td>Style</td>
<td>Textbook primer</td>
<td>Problem / solution / example patterns</td>
</tr>
<tr>
<td>Length</td>
<td>~134 pages, 33 chapters</td>
<td>~92 pages, 22 patterns</td>
</tr>
<tr>
<td>Best for</td>
<td>Getting fluent fast</td>
<td>Surviving the prototype-to-production gap</td>
</tr>
<tr>
<td>Standout</td>
<td>Tool design, memory types, "make it work, right, fast"</td>
<td>Context engineering, evals, the lethal trifecta</td>
</tr>
<tr>
<td>Read it if</td>
<td>You are new to agents</td>
<td>You have a demo and now need reliability</td>
</tr>
</tbody>
</table></div></div>
<h2 id="who-should-actually-read-it"><span class="sec-num" aria-hidden="true">08</span>Who should actually read it</h2>
<p>Read Principles if you are a developer, ideally in TypeScript, who wants a fast and jargon-light on-ramp to how agents work. You can finish it in an evening and immediately hold better conversations about agents.</p>
<p>Read Patterns if you have a working prototype and are staring down the gap between "it demos well" and "it survives real users." That is the book's whole reason to exist, and it delivers there.</p>
<p>If you want a deeper, Python-first, and far more exhaustive treatment of agent architectures, the two Mastra books pair well as the lean counterpart to a heavier text. I wrote about one such book, a 542-page pattern library, in my <a href="../30-agents-every-ai-engineer-must-build-review/">review of <em>30 Agents Every AI Engineer Must Build</em></a>. Read together, the contrast is instructive: one is a comprehensive reference you study, the other is a pocket guide you keep open while you work.</p>
<h2 id="final-word"><span class="sec-num" aria-hidden="true">09</span>Final word</h2>
<div style="display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin:1.5rem 0;padding:1.1rem 1.35rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);box-shadow:var(--shadow-card);"><span style="font-size:2.2rem;font-weight:700;letter-spacing:-.02em;line-height:1;">4.25<span style="font-size:1rem;color:var(--color-text-muted);font-weight:500;"> / 5</span></span><span style="position:relative;display:inline-block;font-size:1.3rem;letter-spacing:2px;line-height:1;"><span style="color:var(--color-text-muted);opacity:.35;">★★★★★</span><span style="position:absolute;top:0;left:0;width:85%;overflow:hidden;white-space:nowrap;color:var(--ios-orange);">★★★★★</span></span><span style="flex:1;min-width:200px;color:var(--color-text-secondary);">The best free on-ramp to agent engineering, with a second volume that is unusually honest about production.</span></div>
<p>Bhagwat's series wins on a rare axis: respect for the reader's time. <strong>Principles</strong> (4 / 5) gets you fluent in an evening. <strong>Patterns</strong> (4.5 / 5) is the one I would keep open while building, because it is about the part everyone skips: what happens after the demo works. That the whole thing is free, and this good, is faintly ridiculous.</p>
<p>Thank you to <a href="https://www.linkedin.com/in/sambhagwat/">Sam Bhagwat</a> and Michelle Gienow for writing them, and for giving them away. You can download both at <a href="https://mastra.ai/book">mastra.ai/book</a>, or grab print copies of <a href="https://www.amazon.com/dp/B0DYH5GHDD">Principles</a> and <a href="https://www.amazon.com/Patterns-Building-Agents-Sam-Bhagwat-ebook/dp/B0G1XV9FQK">Patterns</a> on Amazon. If you read them, I would like to know which pattern you reached for first.</p>
]]></content:encoded>
    </item>
    <item>
      <title>30 Agents Every AI Engineer Must Build: An Honest Review After Three Months With the Book</title>
      <link>https://bcastelino.com/blogs/blog/30-agents-every-ai-engineer-must-build-review/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/30-agents-every-ai-engineer-must-build-review/</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>book-review</category>
      <category>ai-engineering</category>
      <description><![CDATA[An honest, in-depth review of 30 Agents Every AI Engineer Must Build by Imran Ahmad (Packt). Why the book is really a pattern library for production agent engineering, not a catalog of 30 demos.]]></description>
      <content:encoded><![CDATA[<p>Back in April, Dipali Malwatkar (Growth Lead, LLM Engineering at Packt) reached out and sent me a copy of <em>30 Agents Every AI Engineer Must Build</em> by Imran Ahmad. It landed on my desk on <strong>24 April 2026</strong>. I did not want to write a review off the table of contents and a skim, so I sat with it for three months and actually built against it. This is that review.</p>
<p>The short version: the title undersells the book. It sounds like a listicle in hardcover. It is not. This is a book about <strong>agent engineering as a discipline</strong>, and the "30 agents" are the vehicle, not the point.</p>
<div style="display:flex;flex-wrap:wrap;gap:1.75rem;align-items:center;margin:2rem 0;padding:1.5rem;border:1px solid var(--color-border);border-radius:16px;background:var(--color-fill-1);box-shadow:var(--shadow-card);">
<a href="https://www.amazon.com/Agents-Every-Engineer-Must-Build/dp/1806109018/" target="_blank" rel="noopener" style="flex:0 0 auto;">
<img src="https://images-na.ssl-images-amazon.com/images/P/1806109018.01.L.jpg" alt="Cover of 30 Agents Every AI Engineer Must Build by Imran Ahmad" width="160" style="display:block;width:160px;border-radius:10px;margin:0;box-shadow:var(--shadow-card);" />
</a>
<div style="flex:1;min-width:250px;">
<div style="display:flex;align-items:center;gap:.6rem;margin-bottom:.6rem;"><span style="position:relative;display:inline-block;font-size:1.25rem;letter-spacing:2px;line-height:1;"><span style="color:var(--color-text-muted);opacity:.35;">★★★★★</span><span style="position:absolute;top:0;left:0;width:90%;overflow:hidden;white-space:nowrap;color:var(--ios-orange);">★★★★★</span></span><strong style="font-size:1.05rem;">4.5 / 5</strong></div>
<p style="margin:0 0 1rem;"><strong>Quick verdict:</strong> <em>30 Agents Every AI Engineer Must Build</em> is a pattern library disguised as a catalog. Its real subject is the architecture around the model, not prompting tricks. Best for engineers moving from LLM features to production agent systems.</p>
<div style="display:flex;flex-wrap:wrap;gap:1rem;font-size:.9rem;align-items:stretch;">
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Author</span>Imran Ahmad, PhD</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Publisher</span>Packt (2026)</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Length</span>542 pages · 17 chapters</div>
<div style="display:flex;flex-direction:column;gap:.15rem;flex:1 1 0;min-width:0;"><span style="color:var(--color-text-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;">Format</span>Book + executable repo</div>
</div>
</div>
</div>
<h2 id="what-most-reviews-get-right-and-what-they-miss"><span class="sec-num" aria-hidden="true">01</span>What most reviews get right, and what they miss</h2>
<p>The public conversation around this book is still thin, which makes sense for a 2026 release. Packt and Amazon list a 4.5 rating, and the recurring praise is fair: people call it practical, architecture-first, and production-minded. Goodreads notes that it moves cleanly from basic to advanced multi-agent thinking.</p>
<p>All true. But that generic praise misses the actual thesis, and the thesis is the reason the book is worth your time.</p>
<p>Most agent books teach you to <em>call a model well</em>. This one teaches you to <em>build the system around the model</em>. The preface says it plainly: the shift from LLM apps to agents is architectural, not incremental, and raw model calls are not enough. Everything after that earns the claim.</p>
<h2 id="the-hidden-idea-the-agent-is-the-architecture-not-the-model"><span class="sec-num" aria-hidden="true">02</span>The hidden idea: the agent is the architecture, not the model</h2>
<p>If you take one sentence away from the book, make it this:</p>
<div style="margin:1.5rem 0;padding:1.15rem 1.4rem;border-left:4px solid var(--color-accent);border-radius:0 12px 12px 0;background:var(--color-accent-soft);font-size:1.12rem;line-height:1.55;"><strong>the agent is not the model, the agent is the architecture around the model.</strong></div>
<p>Ahmad keeps returning to a single core loop, the cognitive loop of <em>perception, reasoning, planning, action, and learning</em>, and treats everything else (interoperability, lifecycle, prompting, deployment, security, governance) as part of agent engineering rather than as cleanup at the end.</p>
<p>That is why the first third of the book matters more than the "30 agents" framing suggests. Chapter 1 gives you the vocabulary: what actually separates an agent from a script (autonomy, persistence, reactivity, proactiveness, adaptability, goal orientation), the reactive/deliberative/hybrid families, protocols like MCP and A2A for connecting to tools and other agents, and an Agentic AI Progression Framework for classifying maturity from manual operations up to learning agents.</p>
<p>By the time you reach the domain chapters, the point is unmistakable. Healthcare, finance, law, education, and robotics do not need "magic agent prompts." They need different control structures, memory models, validation gates, and escalation rules.</p>
<h2 id="why-the-structure-is-the-argument"><span class="sec-num" aria-hidden="true">03</span>Why the structure is the argument</h2>
<p>The book is built so the foundation carries the rest, and that ordering is deliberate:</p>
<ul>
<li><strong>Chapters 1 to 4</strong> build the operating system: agent foundations, the toolkit (LangChain, LangGraph, LlamaIndex, CrewAI, AutoGen, vector databases, cloud platforms), prompting, and deployment with security and responsible AI.</li>
<li><strong>Chapters 5 to 10</strong> are the reusable building blocks: cognitive architectures, retrieval and knowledge, tool orchestration, analysis and verification, software agents, and conversational or content systems.</li>
<li><strong>Chapters 11 to 16</strong> adapt those blocks to hard domains: multimodal perception, ethics and explainability, healthcare, finance and law, education, and embodied or physical-world systems.</li>
<li><strong>Chapter 17</strong> looks forward to agent societies, governance, and organizational roadmaps.</li>
</ul>
<p>Read that way, "30" is less a count and more a curriculum. You learn what kinds of agent problems exist, which architecture each one needs, and what breaks when you reach for the wrong one.</p>
<h2 id="the-patterns-that-actually-stuck-with-me"><span class="sec-num" aria-hidden="true">04</span>The patterns that actually stuck with me</h2>
<p>These are the parts I kept coming back to while building, not the parts that just read well.</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:1rem;margin:1.5rem 0;">
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Prompting is system design, not copywriting.</strong><span style="color:var(--color-text-secondary);">The PTCF framework (Persona, Task, Context, Format) plus a two-layer prompt architecture (stable system prompt, task-specific user prompt) gave me a repeatable way to define behavior before writing code. The book treats prompts like a constitution for the agent, and pushes you to iterate and evaluate them like software instead of tweaking strings until a demo passes.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Memory is a design decision, not a buffer.</strong><span style="color:var(--color-text-secondary);">Chapter 5's three foundational cognitive architectures (the Autonomous Decision-Making agent, the Planning agent, and the Memory-Augmented agent with working, episodic, and semantic memory) made me rethink how much I was jamming into context windows that should have lived in real memory.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Tool use needs a registry and a funnel.</strong><span style="color:var(--color-text-secondary);">Chapter 7 frames tools as a catalog with capabilities, cost, and constraints, then selects them through intent classification, similarity, constraints, and feedback, with retries and fallbacks when calls fail. That is the difference between a demo and something you can page on.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Do not trust one-shot code generation.</strong><span style="color:var(--color-text-secondary);">The software chapter's test-first, architecture-aware approach to code agents is one of the most practical sections in the book. It insists on state management and explicit review boundaries instead of treating a code agent as a fancier autocomplete.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Brand and persona as constraints.</strong><span style="color:var(--color-text-secondary);">Chapter 10 models brand consistency as a constraint-satisfaction problem and uses a memory hierarchy to keep long conversations coherent. That reframing is genuinely useful if you build assistants that have to stay on-voice across channels.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.5rem;">Verification and governance are first-class.</strong><span style="color:var(--color-text-secondary);">Separate evaluators for facts, safety, and policy, an explain-and-justify habit that pairs decisions with a confidence note, and a governance gate before any external action. In the embodied chapter, that discipline hardens into a unified safety envelope with control hierarchies, world models, and multi-rate perception-action loops. Physical systems get tighter bounds than software-only ones, as they should.</span></div>
</div>
<p>Two lines from the book capture the tone well:</p>
<blockquote style="margin:1.75rem 0;padding:1.4rem 1.6rem;border-left:4px solid var(--color-accent);background:var(--color-fill-1);border-radius:0 14px 14px 0;font-style:italic;font-size:1.12rem;line-height:1.6;">"This transformation is architectural, not merely incremental."<br><br>"Raw LLMs alone are not enough."</blockquote>
<p>The companion <a href="https://github.com/PacktPublishing/30-Agents-Every-AI-Engineer-Must-Build">GitHub repository</a> is worth pulling down. It ships executable, per-chapter code (with a simulation mode so you can run patterns without wiring up every external service) and it is the fastest way to feel the difference between reading a pattern and running it.</p>
<h2 id="where-it-falls-short-the-honest-part"><span class="sec-num" aria-hidden="true">05</span>Where it falls short (the honest part)</h2>
<p>No book earns a real review without the criticism, so here is mine.</p>
<p><strong>Breadth wins over depth, and you can feel it.</strong> Across 542 pages and 17 chapters spanning software, healthcare, law, finance, education, multimodal systems, and robotics, some later domain chapters read more like strong reference architectures than end-to-end implementation manuals for someone already deep in that field. That is a defensible tradeoff for a pattern library, but go in expecting a map, not a fully paved road, in the vertical chapters.</p>
<p><strong>The stack will age faster than the ideas.</strong> The book names concrete frameworks, models, and versions. Useful today, dated in eighteen months. The architectural distinctions (reactive versus deliberative, single agent versus chain-of-agents, generation versus verification, autonomy versus governance) are the part that will still hold.</p>
<p><strong>Case studies are illustrative, not field-validated.</strong> The companion material notes that several "real-world" scenarios use fictional companies navigating real constraints. Good for teaching, but read the business outcomes as scenario design, not independent proof.</p>
<p><strong>The hands-on path leans LangChain and LangGraph.</strong> Not a flaw so much as a bias worth knowing before you start.</p>
<h2 id="how-it-compares-to-typical-ai-agent-books"><span class="sec-num" aria-hidden="true">06</span>How it compares to typical AI agent books</h2>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th>Aspect</th>
<th>This book</th>
<th>Typical recent agent books</th>
</tr>
</thead>
<tbody>
<tr>
<td>Depth and structure</td>
<td>Foundations first (cognition, lifecycle, prompting, deployment, ethics), then 30 applied patterns</td>
<td>Often start with quick builds and explain architecture only lightly</td>
</tr>
<tr>
<td>Production focus</td>
<td>Security, verification, explainability, and human oversight are core chapters</td>
<td>Frequently treated as add-ons after the happy path</td>
</tr>
<tr>
<td>Code and prerequisites</td>
<td>Executable companion repo with simulation mode, but assumes Python and basic ML</td>
<td>Easier to start, but often leave the gap between demo and deployment to you</td>
</tr>
<tr>
<td>Best fit</td>
<td>Engineers moving from LLM features to production agents</td>
<td>Readers wanting a fast intro or a single-framework tour</td>
</tr>
</tbody>
</table></div></div>
<h2 id="who-should-actually-read-it"><span class="sec-num" aria-hidden="true">07</span>Who should actually read it</h2>
<p>Read this if you already know Python and basic ML and you are trying to move past "prompt in, answer out" into systems that plan, act, verify, and operate under real constraints. If you build agents that touch production, or you want a mental model that survives your current framework, this is one of the more grounded books on the topic.</p>
<p>Skip it, or borrow it, if you only want a quick single-framework tutorial or a weekend of copy-paste demos. That is not what this book is trying to be.</p>
<p>If agent infrastructure is your world, it pairs well with where the platforms are heading. I wrote about that shift in my <a href="../databricks-data-ai-summit-2026/">Databricks Data + AI Summit 2026</a> breakdown, where the story was almost entirely about <em>operating</em> and governing agents at scale, which is exactly the muscle this book trains.</p>
<h2 id="final-word-and-a-thank-you"><span class="sec-num" aria-hidden="true">08</span>Final word, and a thank you</h2>
<div style="display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin:1.5rem 0;padding:1.1rem 1.35rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);box-shadow:var(--shadow-card);"><span style="font-size:2.2rem;font-weight:700;letter-spacing:-.02em;line-height:1;">4.5<span style="font-size:1rem;color:var(--color-text-muted);font-weight:500;"> / 5</span></span><span style="position:relative;display:inline-block;font-size:1.3rem;letter-spacing:2px;line-height:1;"><span style="color:var(--color-text-muted);opacity:.35;">★★★★★</span><span style="position:absolute;top:0;left:0;width:90%;overflow:hidden;white-space:nowrap;color:var(--ios-orange);">★★★★★</span></span><span style="flex:1;min-width:200px;color:var(--color-text-secondary);">A pattern library disguised as a catalog, and one of the more grounded agent books I have read.</span></div>
<p><em>30 Agents Every AI Engineer Must Build</em> is really a field guide to agent engineering wearing a catalog's cover. The "30 agents" are 30 reusable architectures you can combine, and the enduring value is the engineering judgment underneath them. It is not a perfect book, the breadth costs it some depth, but it is an unusually honest and useful one. <strong>4.5 / 5</strong>, and it has earned a permanent spot on my shelf.</p>
<p>Thank you, <a href="https://www.linkedin.com/in/dipali-malwatkar/">Dipali Malwatkar</a>, for reaching out and sending the book. I appreciate the trust, and I hope this review does it justice by going past the blurb.</p>
<p>And a real thank you to <a href="https://www.linkedin.com/in/cloudanum/">Imran Ahmad</a> for writing it. It is clear every pattern was pressure-tested against the production realities of latency, cost, reliability, and security, and that care shows on the page.</p>
<p>You can find the book on <a href="https://www.amazon.com/Agents-Every-Engineer-Must-Build/dp/1806109018/">Amazon</a> and via <a href="https://www.packtpub.com/">Packt</a>, and the code on <a href="https://github.com/PacktPublishing/30-Agents-Every-AI-Engineer-Must-Build">GitHub</a>. If you read it, I would genuinely like to hear which of the 30 patterns you reached for first.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Resume Guide I Wish I Had: Build, Fix, and Tailor It to Land the Interview</title>
      <link>https://bcastelino.com/blogs/blog/building-and-enhancing-your-resume/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/building-and-enhancing-your-resume/</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>career</category>
      <description><![CDATA[A complete 2026 guide to building a resume from scratch, finding the gaps, tailoring it to a role and company, and passing the ATS, plus a matching cover letter and the tools that make it faster.]]></description>
      <content:encoded><![CDATA[<p>Most resume advice you will read is written for one reader: a recruiter skimming a stack of paper. That reader still exists, but in 2026 your resume has to get past three others before it reaches a human at all. If it only satisfies one of them, it quietly disappears.</p>
<p>This is the guide I wish I had when I was fixing my own resume and helping friends fix theirs. It moves in the order you should actually work: build a strong draft, find the gaps, tailor it to the role and company, then make it survive the machines. At the end there is a matching cover letter section, a final checklist, and the two tools I keep coming back to.</p>
<div style="margin:1.5rem 0;padding:1.15rem 1.4rem;border-left:4px solid var(--color-accent);border-radius:0 12px 12px 0;background:var(--color-accent-soft);font-size:1.02rem;line-height:1.6;"><strong>Quick answer:</strong> To build a resume that lands interviews in 2026, use a single-column, reverse-chronological layout with standard headings, a 2 to 4 line summary that names your target role, and 4 to 6 achievement bullets per role written as <em>action verb + what you did + tool + quantified result</em>. Then tailor every submission to the job description (aim for a 70 to 80 percent keyword match), quantify about 80 percent of your bullets, and save it as the file type the application requests. Get it read by humans and machines, and keep every claim true.</div>
<h2 id="the-mindset-who-actually-reads-your-resume"><span class="sec-num" aria-hidden="true">01</span>The mindset: who actually reads your resume</h2>
<p>Before you write a word, understand the audience. A hiring manager spends an average of about 6 to 7 seconds on the first scan, so your strongest, most relevant information has to be visible at the top without hunting. But that human is now the last step, not the first.</p>
<p>Here are the four readers your resume has to satisfy, in the order they see it.</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1rem;margin:1.5rem 0;">
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.35rem;">Reader 1</span><strong style="display:block;margin-bottom:.5rem;">The parser</strong><span style="color:var(--color-text-secondary);">Converts your file into structured text fields. It fails on columns, tables, text boxes, images, and contact info hidden in the page header. If it cannot read a section, that section does not exist.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.35rem;">Reader 2</span><strong style="display:block;margin-bottom:.5rem;">The ranker</strong><span style="color:var(--color-text-secondary);">An NLP model scores your resume against the job description for keyword match, skills alignment, and evidence. Placement matters: a keyword in your summary is worth more than the same word in a footer.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.35rem;">Reader 3</span><strong style="display:block;margin-bottom:.5rem;">The recruiter</strong><span style="color:var(--color-text-secondary);">A human who wants fast confidence in your fit. Dense paragraphs and vague duties lose them. A skimmable top third with proof-heavy bullets wins the 6 to 7 seconds.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.35rem;">Reader 4</span><strong style="display:block;margin-bottom:.5rem;">The verifier</strong><span style="color:var(--color-text-secondary);">Increasingly an AI assistant that summarizes you for a decision-maker and cross-checks your resume against your LinkedIn, GitHub, and portfolio. Inconsistent titles or dates read as risk.</span></div>
</div>
<p>The resumes that get interviews are built for all four at once. A beautiful Canva template that a parser turns into gibberish gets rejected before a human sees it. A plain keyword dump that passes the parser but bores the recruiter gets skipped at the next step. You need both.</p>
<blockquote>
<p>A note on the numbers in this guide: figures like "roughly 99 percent of Fortune 500 companies use an ATS" are well established, but some widely quoted parse-rate and preference percentages come from resume-tool vendors testing their own products, not peer-reviewed studies. I have flagged those as illustrative. The direction is reliable even where the exact number is not.</p>
</blockquote>
<h2 id="step-1-build-the-resume-from-scratch"><span class="sec-num" aria-hidden="true">02</span>Step 1: Build the resume from scratch</h2>
<p>Start with structure, not styling. Get the right sections in the right order, then fill them with evidence.</p>
<h3 id="section-order-depends-on-where-you-are">Section order depends on where you are</h3>
<p>Order your sections by what is strongest and most relevant. For students and early-career applicants, education and projects usually earn a spot near the top. Once you have real work history, experience leads.</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1rem;margin:1.5rem 0;">
<div style="padding:1.2rem 1.4rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.6rem;">Student / intern / new grad</strong><ol style="margin:0;padding-left:1.2rem;color:var(--color-text-secondary);line-height:1.8;"><li>Header and contact</li><li>Summary (2 lines)</li><li>Education</li><li>Skills</li><li>Projects</li><li>Experience</li><li>Certifications / extras</li></ol></div>
<div style="padding:1.2rem 1.4rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.6rem;">Experienced (2+ years)</strong><ol style="margin:0;padding-left:1.2rem;color:var(--color-text-secondary);line-height:1.8;"><li>Header and contact</li><li>Summary</li><li>Skills</li><li>Experience</li><li>Projects</li><li>Education</li><li>Certifications / extras</li></ol></div>
</div>
<h3 id="header">Header</h3>
<p>Your name is the largest text on the page. Under it, put a single contact line with items separated by a vertical bar: location or relocation status, email, phone, LinkedIn, GitHub, and portfolio, each hyperlinked. Leave out your full mailing address, photo, date of birth, and marital status. Keep contact details in the body of the document, never in the page header or footer, because parsers often drop those.</p>
<h3 id="summary">Summary</h3>
<p>Two to four sentences, or a tight two-bullet version. Lead with your target title, years of experience, and core specializations, then close with a standout credential. Skip generic adjectives like "hardworking" and "team player." A two-bullet structure works well:</p>
<ul>
<li><strong>Overview:</strong> "Data analyst with 1.5 years across fintech and retail, focused on data wrangling, visualization, and stakeholder reporting."</li>
<li><strong>Proof:</strong> "Built a customer churn model in Python and Tableau that cut churn by 15 percent."</li>
</ul>
<h3 id="experience-the-accomplishment-formula">Experience: the accomplishment formula</h3>
<p>This is the section that decides most interviews. Each entry is a header line (role, organization, dates tied to the title) followed by 4 to 6 achievement bullets. Write every bullet with a strong action verb and this formula: <strong>action verb + what you did + tool or method + quantified result.</strong></p>
<p>Anyone can list duties. Strong bullets answer four questions: what did you do, why, how, and what was the impact. A simpler way to remember it is <strong>Problem + Action + Result</strong>: the situation you faced, what you did about it, and the outcome. Quantify about 80 percent of your bullets with a number, percent, timeframe, or scale, and bold the metrics so they survive the 6 second scan.</p>
<div style="margin:1.5rem 0;border:1px solid var(--color-border);border-radius:14px;overflow:hidden;">
<div style="padding:1rem 1.3rem;background:color-mix(in srgb, var(--ios-red, #ff3b30) 10%, transparent);border-bottom:1px solid var(--color-border);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.3rem;">Weak</span><span style="color:var(--color-text-secondary);">Responsible for deployments and marketing campaigns.</span></div>
<div style="padding:1rem 1.3rem;background:color-mix(in srgb, var(--ios-green, #34c759) 12%, transparent);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.3rem;">Strong</span><span style="color:var(--color-text-secondary);">Reduced deployment cycle time by <strong>40 percent</strong> by automating CI/CD with <strong>MLflow</strong>, and led a month-long social campaign that drew <strong>585 attendees</strong> and lifted donations <strong>20 percent</strong>.</span></div>
</div>
<p>Use past tense for previous roles and present tense for your current one. Order bullets from most to least impressive. If you need help with verbs, group them by category (led, orchestrated, spearheaded for leadership; engineered, optimized, automated for technical work) and vary them so no two bullets start the same way.</p>
<p>Two writing rules that trip up most first drafts: <strong>drop the personal pronoun "I"</strong> (start with the verb: "Built," not "I built") and <strong>avoid passive voice</strong> ("Reduced latency," not "latency was reduced"). For technical roles, name the <strong>languages, frameworks, platforms, and tools</strong> in each experience entry, not just in your projects, so a reviewer can see your stack in context. One more filter worth applying to every line: could you confidently talk about it in an interview? If not, cut it or rewrite it until you can defend it.</p>
<h3 id="skills">Skills</h3>
<p>Group skills into labeled categories and put one category per line, with the category name in bold and a comma-separated list after it. Order both the categories and the items by relevance to the target role. Skills-first, categorized sections parse more accurately and let a recruiter scan your stack in seconds. Keep soft skills out of here; prove those through your experience bullets instead.</p>
<ul>
<li><strong>Languages:</strong> Python, SQL, R</li>
<li><strong>Cloud and data:</strong> AWS, Databricks, dbt, Airflow</li>
<li><strong>Visualization:</strong> Power BI, Tableau, Looker</li>
</ul>
<h3 id="projects-education-and-certifications">Projects, education, and certifications</h3>
<p>For students and career switchers, projects do heavy lifting. Give each a title, start and end dates, and a repo or demo link, then 1 to 2 bullets written like experience bullets: what you built, the stack, and a measurable result. Make it easy to find the code or a deployed version, and if you made a critical technical decision (why this database, why this architecture), say so briefly. That reasoning is exactly what an interviewer will ask about.</p>
<p>For education, use one line per degree, most recent first. Include your GPA (cumulative or major, whichever is stronger) only if it is above about 3.3; if both are below that, leave it off. Bootcamp and non-university technical coursework counts, so list programs like CodePath, and add relevant coursework only when your projects and experience are still thin. Include your high school only if you are a college freshman, or if you earned a standout honor like valedictorian. For certifications, list current, verifiable credentials with a "show credential" link, and prioritize proctored ones over self-paced course certificates.</p>
<h2 id="step-2-find-the-gaps-self-audit"><span class="sec-num" aria-hidden="true">03</span>Step 2: Find the gaps (self-audit)</h2>
<p>Before you send anything, run your draft through the same five checks the four readers apply. This is where most resumes quietly fail.</p>
<div style="margin:1.5rem 0;padding:1.3rem 1.5rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);">
<strong style="display:block;margin-bottom:.8rem;">The 5-layer resume audit</strong>
<div style="display:flex;gap:.9rem;margin-bottom:.85rem;"><span style="flex:0 0 auto;width:1.7rem;height:1.7rem;border-radius:50%;background:var(--color-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.9rem;">1</span><span style="color:var(--color-text-secondary);"><strong>Parse:</strong> Open your file, select all, and paste it into a plain text editor. If sections scramble, dates detach from titles, or your name lands mid-sentence, fix the layout before anything else.</span></div>
<div style="display:flex;gap:.9rem;margin-bottom:.85rem;"><span style="flex:0 0 auto;width:1.7rem;height:1.7rem;border-radius:50%;background:var(--color-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.9rem;">2</span><span style="color:var(--color-text-secondary);"><strong>Match:</strong> Does your resume use the same role language as the job description? Missing keywords is the single most common rejection reason.</span></div>
<div style="display:flex;gap:.9rem;margin-bottom:.85rem;"><span style="flex:0 0 auto;width:1.7rem;height:1.7rem;border-radius:50%;background:var(--color-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.9rem;">3</span><span style="color:var(--color-text-secondary);"><strong>Evidence:</strong> Does every important skill you claim have a bullet that proves you used it to produce a result? Skills with no proof read as filler.</span></div>
<div style="display:flex;gap:.9rem;margin-bottom:.85rem;"><span style="flex:0 0 auto;width:1.7rem;height:1.7rem;border-radius:50%;background:var(--color-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.9rem;">4</span><span style="color:var(--color-text-secondary);"><strong>Human 30-second test:</strong> Hand it to someone for 30 seconds, then ask what role you are targeting and your top achievement. If they cannot answer, your top third is not clear enough.</span></div>
<div style="display:flex;gap:.9rem;"><span style="flex:0 0 auto;width:1.7rem;height:1.7rem;border-radius:50%;background:var(--color-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.9rem;">5</span><span style="color:var(--color-text-secondary);"><strong>Verify:</strong> Do your titles, dates, and claims match your LinkedIn, GitHub, and portfolio exactly? Mismatches undermine the whole application.</span></div>
</div>
<p>Common gaps to hunt for: duties instead of outcomes, bullets with no numbers, an objective statement where a summary should be, a skills block buried at the bottom, inconsistent date formats, and part-time or volunteer roles dropped entirely instead of reframed as accomplishments. Do not omit retail, food service, or gig work: reframe "provided customer service at a store" as "advised 30+ customers daily and trained 3 new hires on store procedures."</p>
<h2 id="step-3-enhance-by-role-and-company-tailoring"><span class="sec-num" aria-hidden="true">04</span>Step 3: Enhance by role and company (tailoring)</h2>
<p>A generic resume sent to every job is the lowest-return move in the search. Tailoring is not swapping a few words; it is translating your experience into the specific language a given team uses about its own work. Budget about 10 to 15 minutes per application once you have a strong master resume.</p>
<p>The three moves that matter:</p>
<ol>
<li><strong>Match vocabulary.</strong> If the posting says "stakeholder management" and your resume says "worked with cross-functional teams," the ranker does not know those are the same thing. Use their exact terms, not synonyms.</li>
<li><strong>Reorder by emphasis.</strong> The first 3 to 4 responsibilities in the job description are what the team cares about most. Your top 3 to 4 bullets in your most recent role should map to those, in the same order.</li>
<li><strong>Strengthen with specifics.</strong> Swap generic bullets for ones that show the tool, the scope, and the metric, written the way the company writes about its own work.</li>
</ol>
<p>A fast, repeatable workflow: build a T-chart. In the left column, list the requirements from the posting. In the right column, write one specific example of how you have demonstrated each. Then pull those examples into your summary, skills, and top bullets, and use your 3 to 5 strongest for stories in the cover letter.</p>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1.5rem 0;">
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:color-mix(in srgb, var(--ios-red, #ff3b30) 8%, transparent);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.4rem;">Generic bullet</span><span style="color:var(--color-text-secondary);">Built dashboards and worked with the data team.</span></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:color-mix(in srgb, var(--ios-green, #34c759) 10%, transparent);"><span style="display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.4rem;">Tailored to a "marketing attribution" role</span><span style="color:var(--color-text-secondary);">Built <strong>Looker</strong> dashboards used by a 12-person product team to track NPS, retention, and feature adoption, and maintained <strong>ETL pipelines</strong> for marketing attribution data.</span></div>
</div>
<p>One rule that cannot bend: rewrite, do not fabricate. Never add a skill you do not have. It gets caught in the interview, and it gets caught in the reference check. Tailoring reorders and rephrases what is true; it does not invent.</p>
<h2 id="step-4-ats-optimization-beat-the-bots-without-gaming-them"><span class="sec-num" aria-hidden="true">05</span>Step 4: ATS optimization (beat the bots without gaming them)</h2>
<p>An ATS (Applicant Tracking System) first parses your document into fields, then ranks it against the job description. Roughly 99 percent of Fortune 500 companies use one, so this is the default case, not an edge case. The good news: the same choices that pass the parser also make your resume clearer for the human on the other side.</p>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1.5rem 0;">
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:color-mix(in srgb, var(--ios-green, #34c759) 9%, transparent);"><strong style="display:block;margin-bottom:.6rem;color:var(--color-text-primary);">Do</strong><ul style="margin:0;padding-left:1.1rem;color:var(--color-text-secondary);line-height:1.75;"><li>Single column, top to bottom</li><li>Standard headings: Experience, Education, Skills</li><li>Dates as <code>Month YYYY</code>, tied to titles</li><li>System fonts: Calibri, Arial, Helvetica, Georgia</li><li>Round bullets and plain text</li><li>File named <code>LastnameFirstname</code></li></ul></div>
<div style="padding:1.15rem 1.3rem;border:1px solid var(--color-border);border-radius:14px;background:color-mix(in srgb, var(--ios-red, #ff3b30) 8%, transparent);"><strong style="display:block;margin-bottom:.6rem;color:var(--color-text-primary);">Do not</strong><ul style="margin:0;padding-left:1.1rem;color:var(--color-text-secondary);line-height:1.75;"><li>Multi-column layouts or tables</li><li>Text boxes, icons, logos, charts</li><li>Skill bars like "Python 85%"</li><li>Photos or decorative graphics</li><li>Creative headings like "My Journey"</li><li>Contact info in the page header/footer</li></ul></div>
</div>
<p><strong>File type:</strong> submit what the application asks for. A standard <code>.docx</code> is the safest choice across enterprise systems and is the better bet for legacy parsers like Oracle Taleo. Text-based PDFs preserve your layout and parse cleanly on modern platforms like Greenhouse and Lever. The one hard rule: never submit an image-based or Canva-flattened PDF, because parse rates for those collapse (some vendor tests put them near 4 percent; treat the exact figure as illustrative, but the risk is real). Test yours by trying to highlight the text.</p>
<p><strong>Semantic matching, not stuffing:</strong> modern rankers infer meaning, so keyword stuffing is penalized. Integrate each major keyword at most once or twice per bullet, woven naturally. Aim for a 70 to 80 percent thematic match with the posting rather than a copy-paste, and include adjacent skills (a data scientist listing "data visualization" alongside "stakeholder communication") to signal real-world application. Keep roughly 80 percent of your experience bullets carrying a concrete metric, because AI screeners weight verifiable results far above vague claims.</p>
<p><strong>On AI and fairness:</strong> no major enterprise ATS rejects a resume for being AI-assisted, and clean, well-structured resumes tend to do better, not worse. Regulation is also moving toward human oversight: GDPR Article 22 gives EU candidates the right not to be subject to purely automated decisions with significant effects, and the EU AI Act treats recruitment AI as high-risk. The practical takeaway is simple: a cleanly formatted, semantically aligned, truthful resume is the most likely to reach human eyes.</p>
<div style="margin:1.5rem 0;padding:1.2rem 1.5rem;border:1px dashed var(--color-border);border-radius:14px;background:var(--color-fill-1);"><strong style="display:block;margin-bottom:.6rem;">ATS quick checklist</strong><ul style="margin:0;padding-left:1.1rem;color:var(--color-text-secondary);line-height:1.85;"><li>Single column, no tables, text boxes, or images</li><li>Standard headings and <code>Month YYYY</code> dates tied to titles</li><li>System font, round bullets, selectable text</li><li>3 to 5 job-description keywords woven in, each used at most twice per bullet</li><li>Adjacent and related skills included for semantic clustering</li><li>About 80 percent of experience bullets carry a metric</li><li>File named <code>LastnameFirstname</code>, in the requested format</li><li>Every keyword and number is true and evidenced elsewhere</li></ul></div>
<h2 id="step-5-the-matching-cover-letter"><span class="sec-num" aria-hidden="true">06</span>Step 5: The matching cover letter</h2>
<p>The cover letter is your chance to connect the dots the resume only lists. Keep it to one page and three to four short paragraphs, reuse your resume header so the two look like a set, and address a specific person whenever you can. Structure it as <strong>Hook, Proof, Close.</strong></p>
<ul>
<li><strong>Hook:</strong> Open with a brief story, a standout result, or a genuine connection to the company's mission, then name the role. If someone referred you, put their name in the first sentence. Skip "I am writing to apply for."</li>
<li><strong>Proof:</strong> Map your 3 to 5 strongest, quantified achievements to the job description. Do not restate the whole resume; pick the wins that match what this team needs and show them as bullets.</li>
<li><strong>Close:</strong> Restate your fit in a sentence, give your email and phone for easy follow-up, and thank the reader sincerely. End on a confident, human note.</li>
</ul>
<p>Match the cover letter's font and header to your resume, export it as a selectable-text PDF named clearly (for example <code>FirstName_LastName_CoverLetter.pdf</code>), and write a fresh one for every application. A tailored letter that mirrors the posting's priorities is what separates a memorable application from a form submission.</p>
<h2 id="iterate-the-final-pre-submit-checklist"><span class="sec-num" aria-hidden="true">07</span>Iterate: the final pre-submit checklist</h2>
<p>Treat every send as a small experiment. Tailor, submit, and note what earns replies, then adjust.</p>
<ul>
<li>One page for students and most candidates, two only with 10+ years of relevant experience.</li>
<li>Consistent formatting, no typos, every link working and pointing to the right place.</li>
<li>Every bullet starts with a varied action verb (no "I", no passive voice) and follows Problem, Action, Result with a number.</li>
<li>Every line is something you could confidently explain in an interview.</li>
<li>3 to 5 job-description keywords mirrored naturally, tested for a 70 to 80 percent match.</li>
<li>Standard headings, round bullets, dates tied to titles, no images or tables.</li>
<li>Titles and dates consistent with your LinkedIn and portfolio.</li>
<li>Saved in the requested format and named <code>LastnameFirstname</code>.</li>
<li>A tailored, one-page cover letter addressed to a real person.</li>
</ul>
<h2 id="resources"><span class="sec-num" aria-hidden="true">08</span>Resources</h2>
<p>These are the two I recommend starting with, plus a few more that speed up the work.</p>
<div style="margin:1.5rem 0;display:grid;gap:1rem;">
<a href="https://chatgpt.com/g/g-682ff83d34c081918c6c39356788442f-resume-enhancer" target="_blank" rel="noopener" style="display:block;padding:1.25rem 1.4rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);box-shadow:var(--shadow-card);text-decoration:none;"><strong style="display:block;margin-bottom:.4rem;color:var(--color-accent);">Resume Enhancer (Custom GPT)</strong><span style="color:var(--color-text-secondary);">Paste in your resume and a job description and get targeted, truthful enhancement suggestions: stronger action verbs, quantified bullets, keyword gaps to close, and tailoring notes for the specific role. Use it to refine, then rewrite in your own voice.</span></a>
<a href="https://www.overleaf.com/read/vwnwnhhngvqs#3d0cf2" target="_blank" rel="noopener" style="display:block;padding:1.25rem 1.4rem;border:1px solid var(--color-border);border-radius:14px;background:var(--color-fill-1);box-shadow:var(--shadow-card);text-decoration:none;"><strong style="display:block;margin-bottom:.4rem;color:var(--color-accent);">Overleaf Template (Resume + Cover Letter)</strong><span style="color:var(--color-text-secondary);">A clean, single-column, ATS-friendly LaTeX template that covers both the resume and a matching cover letter, so your two documents share one consistent personal brand. A solid starting point if you want a polished layout without fighting a word processor.</span></a>
</div>
<p>A few more tools worth keeping in the kit:</p>
<ul>
<li><strong>Jobscan</strong> for testing your keyword and match score against a specific job description before you submit.</li>
<li><strong>Simplify Copilot</strong> (browser extension) for autofilling applications and surfacing keywords from postings.</li>
<li><strong>RenderCV and the FAANGPath simple template</strong> if you want alternative ATS-friendly LaTeX layouts.</li>
</ul>
<h3 id="bonus-mine-your-own-linkedin-first">Bonus: mine your own LinkedIn first</h3>
<p>Remember the fourth reader, the verifier, and the checklist item about keeping your resume consistent with your LinkedIn. The fastest way to close that gap is to actually look at your own LinkedIn data, and most people never do. Your profile already holds years of roles, skills, and connections you can turn into quantified bullets and a tighter skills section, and reviewing it side by side with your resume is how you catch the title and date mismatches before a recruiter does.</p>
<p>That is the itch I built this next tool to scratch.</p>
<div style="margin:1.5rem 0;">
<a href="https://bcastelino.com/linkedin-data-visualizer/" target="_blank" rel="noopener" style="display:block;padding:1.25rem 1.4rem;border:1px solid var(--color-border);border-radius:14px;background:linear-gradient(135deg, var(--color-accent-soft), var(--color-fill-1));box-shadow:var(--shadow-card);text-decoration:none;"><span style="display:inline-block;font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;color:var(--color-accent);font-weight:700;margin-bottom:.5rem;">Bonus tool I built</span><strong style="display:block;margin-bottom:.4rem;color:var(--color-text-primary);font-size:1.05rem;">LinkedIn Data Visualizer</strong><span style="display:block;color:var(--color-text-secondary);margin-bottom:.6rem;">A static, browser-only React app that turns your LinkedIn data export ZIP into an interactive insights dashboard, with optional LLM-powered narrative summaries and a downloadable HTML report. Nothing leaves your machine, so you can safely explore your full history and pull the strongest, most quantifiable details straight into your resume.</span><span style="display:inline-flex;gap:1rem;font-size:.85rem;color:var(--color-accent);font-weight:600;">Open the app &rsaquo;</span></a>
</div>
<p>Request your data export from LinkedIn (Settings, then Data Privacy, then Get a copy of your data), drop the ZIP into the app, and use what surfaces to fill the gaps from the <a href="#step-2-find-the-gaps-self-audit">self-audit</a>. The code is open source on <a href="https://github.com/bcastelino/linkedin-data-visualizer">GitHub</a> if you want to see how it works or run it locally.</p>
<h2 id="the-one-thing-to-remember"><span class="sec-num" aria-hidden="true">09</span>The one thing to remember</h2>
<p>Your resume will not get you the job. It will get you the interview. Every choice above serves that single goal: be readable to the machines, be clear and specific to the humans, and be honest at every layer. Build the strong draft, find the gaps, tailor it to the role, pass the ATS, then send it and iterate.</p>
<p>New here? You might also like <a href="../welcome-to-my-blog/">why I built this blog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Databricks Data + AI Summit 2026: The Lakehouse Becomes the Agentic Control Plane</title>
      <link>https://bcastelino.com/blogs/blog/databricks-data-ai-summit-2026/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/databricks-data-ai-summit-2026/</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>databricks</category>
      <category>data-engineering</category>
      <category>ai-engineering</category>
      <description><![CDATA[A technical deep dive into Databricks Data + AI Summit 2026: Genie One, Unity AI Gateway, Lakeflow, LTAP, Lakebase, and Lakewatch, and what each announcement means for data and AI engineers.]]></description>
      <content:encoded><![CDATA[<p>Databricks used <strong>Data + AI Summit 2026</strong> to make a clear pivot: from <em>"how do we build agents?"</em> to <em>"how do we <strong>run</strong> agents, apps, and databases on a single governed plane at scale?"</em> The summit's tagline, <strong>"Build apps and agents that work"</strong>, was literal. The center of gravity moved from prototypes to production: governing agents, controlling AI spend, and unifying operational and analytical data.</p>
<p>This post is a structured, source-backed walkthrough for data engineers, analytics engineers, AI engineers, and enterprise architects. Where helpful, I've embedded the official Databricks keynote and session videos so you can go straight to the source.</p>
<blockquote>
<p><strong>Note on sourcing:</strong> This recap prioritizes official Databricks announcements and reputable coverage. Confirmed product announcements are stated plainly; analyst interpretation and keynote-only details are flagged as such. Full links are in the <a href="#sources-official-and-reputable-coverage">source table</a> at the end.</p>
</blockquote>
<p><strong>Quick answer:</strong> Databricks Data + AI Summit 2026 (DAIS 2026) was Databricks' annual data and AI conference, held June 15 to 18, 2026 at the Moscone Center in San Francisco with more than 30,000 in-person attendees. Its headline launches were Genie One, Unity AI Gateway, Lakeflow, LTAP with Lakebase, and the Lakewatch security lakehouse.</p>
<h2 id="tldr-the-five-things-that-matter"><span class="sec-num" aria-hidden="true">01</span>TL;DR: the five things that matter</h2>
<ul>
<li><strong>Event:</strong> DAIS 2026 ran <strong>June 15–18 at Moscone Center, San Francisco</strong>, with 30,000+ in-person attendees, tens of thousands virtual across 150+ countries, and 800+ breakout sessions.</li>
<li><strong>Genie One</strong>: Genie evolves from AI/BI chat into a <strong>governed agentic coworker</strong> (web, iOS, Android, Slack, Teams, MCP), backed by <strong>Genie Ontology</strong>, <strong>Genie Agents</strong>, <strong>App Builder</strong>, and <strong>ZeroOps</strong>.</li>
<li><strong>Unity AI Gateway</strong> + expanded <strong>Unity Catalog</strong>: runtime governance for models, agents, and tools: contextual policies, hard spend caps, unified tracing, semantics (Glossary, Domains, Metrics), and cross-cloud/region governance.</li>
<li><strong>Lakeflow</strong>: unified, agentic data engineering: Lakeflow Designer (GA), 100+ Connect connectors, Zerobus ingest, Real-Time Mode for Spark Declarative Pipelines, and Lakeflow Jobs as a platform orchestrator.</li>
<li><strong>LTAP + Lakebase + Lakehouse//RT</strong>: <strong>Lake Transactional/Analytical Processing</strong> unifies OLTP and OLAP on a single storage copy, with serverless Postgres (Lakebase) and a millisecond-latency engine (Lakehouse//RT).</li>
<li><strong>Lakewatch + Panther</strong>: an "agentic SIEM" security lakehouse, plus the intended acquisition of Panther to bring AI SOC workflows into the platform.</li>
</ul>
<p><strong>If you internalize only three things for 2026–2027:</strong></p>
<ol>
<li><strong>LTAP + Lakebase</strong> aims to collapse the OLTP/OLAP split and remove CDC/ETL between operational and analytical systems.</li>
<li><strong>Genie + Unity AI Gateway + Unity Catalog</strong> define the <strong>runtime control plane</strong> for agents, models, and AI/BI, including spend and policy enforcement.</li>
<li><strong>Lakeflow + Lakewatch</strong> signal that data engineering and security operations will increasingly be run <em>by</em> agents on the lakehouse.</li>
</ol>
<h2 id="event-overview"><span class="sec-num" aria-hidden="true">02</span>Event overview</h2>
<ul>
<li><strong>Dates &#x26; location:</strong> June 15–18, 2026, at Moscone North/West/South, San Francisco, with hybrid virtual attendance.</li>
<li><strong>Scale:</strong> 30,000+ in-person and tens of thousands virtual participants from 150+ countries, across 800+ breakout sessions spanning data engineering, governance, AI, applications, and agents.</li>
<li><strong>Audience:</strong> Data engineers, ML/AI engineers, data scientists, BI developers, architects, app developers, and executives.</li>
<li><strong>Tone vs. prior years:</strong>
<ul>
<li>2024–2025: <em>"How do we build agents and RAG?"</em></li>
<li>2026: <em>"How do we <strong>operate</strong> agents and AI apps reliably, govern them, control cost, and run on unified data?"</em></li>
</ul>
</li>
</ul>
<p>Analysts consistently noted the shift from proof-of-concept demos to operating models, agents, and security at production scale.</p>
<h3 id="watch-the-day-1-keynote">Watch: the Day 1 keynote</h3>
<p>The full Day 1 keynote is the best single source for the announcement sequencing, Unity AI Gateway, Genie Ontology/One/Agents, Lakewatch, CustomerLake, Reyden/Lakehouse//RT, LTAP, and Lakeflow.</p>
<a href="https://www.youtube.com/watch?v=Qux8E-L1mk8" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/Qux8E-L1mk8/maxresdefault.jpg" alt="Data + AI Summit Keynote 2026, Day 1" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Data + AI Summit Keynote 2026, Day 1 <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<h3 id="watch-the-day-2-keynote">Watch: the Day 2 keynote</h3>
<p>The Day 2 keynote dives deeper into the developer and research side: open source, AI engineering, and the technical underpinnings of the agentic platform.</p>
<a href="https://www.youtube.com/watch?v=sn9My5Pj0mE" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/sn9My5Pj0mE/maxresdefault.jpg" alt="Data + AI Summit Keynote 2026, Day 2" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Data + AI Summit Keynote 2026, Day 2 <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<h2 id="ai-and-the-agentic-platform"><span class="sec-num" aria-hidden="true">03</span>AI and the agentic platform</h2>
<h3 id="genie-one-ontology-agents-app-builder-zeroops">Genie One, Ontology, Agents, App Builder, ZeroOps</h3>
<ul>
<li><strong>Genie One</strong> evolves Genie from AI/BI chat into a <strong>data-smart agentic coworker</strong> for business users, available on web, iOS, Android, Slack, Teams, and as an MCP app for other assistants. It connects via Lakehouse federation, Lakeflow Connect, and 50+ workplace apps (Google Drive, Jira, Slack, Confluence, SharePoint, email), and can schedule tasks, send alerts, create docs, and call tools.</li>
<li><strong>Genie Ontology</strong> is an automatically learned <strong>enterprise context graph</strong> that extracts meaning from tables, queries, dashboards, pipelines, and apps, ranks authoritative definitions (PageRank-style), and enforces ACLs via Unity Catalog.</li>
<li><strong>Genie Agents</strong> turn curated "Spaces" into reusable agents that reason over structured and unstructured data and take autonomous actions via tools, MCP connections, and write-backs, all governed by Unity AI Gateway/Unity Catalog.</li>
<li><strong>Genie App Builder</strong> (private preview) is a vibe-coding environment: upload context, and Genie produces a build plan and a live app against governed data, enforcing Unity Catalog permissions.</li>
<li><strong>Genie ZeroOps</strong> is a background agent that watches pipelines, tables, jobs, and models, performs root-cause analysis using logs, metrics, and lineage, proposes fixes, tests them in a sandbox, and lets humans approve.</li>
</ul>
<p><strong>Pricing/packaging:</strong> Genie moves to <strong>usage-based, no-seat pricing</strong>, with up to <strong>$10 of free usage per user per month</strong>; organizations pay only for AI consumed (token-based).</p>
<a href="https://www.youtube.com/watch?v=6W3BnCgoYVA" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/6W3BnCgoYVA/maxresdefault.jpg" alt="Introducing Genie One: the AI coworker that understands your data (with demo)" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Introducing Genie One: the AI coworker that understands your data (with demo) <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<h3 id="unity-ai-gateway-and-agent-governance">Unity AI Gateway and agent governance</h3>
<p><strong>Unity AI Gateway</strong> is the runtime governance and telemetry layer for models, agents, tools, and MCP services:</p>
<ul>
<li><strong>One place to govern all AI assets</strong>, register Databricks-hosted and external models, agents, skills, and MCP services alongside data, with the same access controls, discovery, lineage, and auditing as Unity Catalog tables.</li>
<li><strong>Contextual Service Policies (Beta)</strong>, <em>runtime</em> policies that allow/deny/require approval for actions like pushing code to GitHub, writing to certain paths, blocking PII in responses, and guarding against prompt injection.</li>
<li><strong>AI budgets + hard caps</strong>, central budgets now cover external BYO-key providers; hard caps <em>stop</em> requests when a budget is hit, not just alert.</li>
<li><strong>Unified tracing</strong>, model and MCP traces feed into Lakewatch for investigation, giving full auditability of agent tool calls.</li>
</ul>
<p>Analysts argue that Unity AI Gateway + Unity Catalog together make the catalog <em>"the control plane for enterprise AI, not just data."</em></p>
<h3 id="agent-bricks-and-mosaic-ai">Agent Bricks and Mosaic AI</h3>
<ul>
<li><strong>Agent Bricks</strong> is Databricks' agent platform, integrated with Lakewatch and hands-on training; official materials emphasize Vector Search, AI Playground, and Foundation Model APIs to build RAG agents with <strong>MLflow Tracing</strong>–based observability.</li>
<li>Lakewatch, Genie, and Lakeflow all rely on <strong>Mosaic AI</strong> components (models, vector search, evaluation, tracing) under the hood, but most Mosaic-specific updates were folded into these products rather than launched under separate branding. <em>(Inference based on keynote/product positioning; no standalone "What's new in Mosaic AI" Summit blog was found in the sources reviewed.)</em></li>
</ul>
<a href="https://www.youtube.com/watch?v=GezX9a_9bwI" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/GezX9a_9bwI/maxresdefault.jpg" alt="How Agent Bricks gives developers choice, context and control (with demo)" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ How Agent Bricks gives developers choice, context and control (with demo) <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<p>For ML engineers specifically, <strong>Genie Code</strong> gained upgraded intelligence for ML workflows, feature engineering, training, and evaluation, with native integrations across the Databricks ML platform.</p>
<a href="https://www.youtube.com/watch?v=C1rEj2VQtwU" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/C1rEj2VQtwU/maxresdefault.jpg" alt="Agentic machine learning with Genie Code (includes demo)" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Agentic machine learning with Genie Code (includes demo) <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<h2 id="data-engineering-delta-streaming-and-ltap"><span class="sec-num" aria-hidden="true">04</span>Data engineering, Delta, streaming, and LTAP</h2>
<h3 id="lakeflow-unified-agentic-data-engineering">Lakeflow: unified, agentic data engineering</h3>
<p>The Lakeflow update is the most material announcement for data engineering teams.</p>
<a href="https://www.youtube.com/watch?v=0WDGu-IPmZM" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/0WDGu-IPmZM/maxresdefault.jpg" alt="Unlocking agentic data engineering with Lakeflow + Genie" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Unlocking agentic data engineering with Lakeflow + Genie <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<p>Key pillars:</p>
<ul>
<li><strong>Lakeflow Designer (GA)</strong>: a visual, AI-powered no-code canvas for Spark Declarative Pipelines; flows compile down to real SDP code, so engineers can refine without translation gaps.</li>
<li><strong>Genie Code + Lakeflow</strong>: Genie Code is embedded to generate connectors, pipelines (Python/SQL), and job DAGs with triggers and dependencies, using full end-to-end context.</li>
<li><strong>Lakeflow Connect</strong>: 100+ native managed connectors to apps, databases, and file stores; query-based CDC for all DB and federation sources, plus a "Community Connectors" OSS framework. <strong>Free tier:</strong> 100 DBUs/day, supporting up to 100M records/day.</li>
<li><strong>Zerobus Ingest (GA)</strong>: Kafka-free ingestion for high-volume events: near-real-time writes (&#x3C;5s), up to 100 MB/s per stream and >10 GB/s per table, with a Kafka-compatible API (Beta), gRPC + REST (GA), SDKs for Python/Java/Rust/Go/TypeScript, and OpenTelemetry (public preview).</li>
<li><strong>Spark Declarative Pipelines Real-Time Mode (Public Preview)</strong>: ~5 ms end-to-end latency on a Spark-only stack (no separate Flink cluster), on classic and serverless compute.</li>
<li><strong>Lakeflow Jobs</strong>: a native orchestrator with <strong>data-aware triggers</strong> (jobs fire when SQL-expressed "ready" conditions are met), <strong>external orchestration</strong> (operators for Snowflake, REST APIs, Slack, PagerDuty, etc., with 40+ examples), and Unity Catalog–governed credentials and audit.</li>
</ul>
<p><strong>Customer proof points:</strong> Panasonic reported a <strong>50% reduction in Power BI refresh times</strong> after consolidating legacy ETL onto Databricks via Lakeflow; Meta cut end-to-end pipeline latency to under a minute with Zerobus + SDP Real-Time Mode.</p>
<h3 id="ltap-lakebase-and-lakehousert">LTAP, Lakebase, and Lakehouse//RT</h3>
<ul>
<li><strong>LTAP (Lake Transactional/Analytical Processing)</strong> unifies transactions, analytics, streaming, and operational data on a <strong>single copy of data in the lake</strong>, built on Lakebase and the Lakehouse. It writes OLTP data directly into Delta/Iceberg in Unity Catalog with Postgres semantics and full ACID, eliminating the CDC/ETL duplication between OLTP and OLAP, with strict isolation between transactional and analytical workloads.</li>
<li><strong>Lakebase</strong> (serverless Postgres on object storage) now serves thousands of customers and reportedly <strong>12M database launches/day</strong>, adding cross-cloud/region disaster recovery, git-style branching and snapshots, and autonomous DB operations (agents monitor health, propose indexes, assist recovery).</li>
<li><strong>Lakehouse//RT + Reyden</strong>: a real-time warehouse engine delivering millisecond-scale query latency and tens of thousands of concurrent users directly on Delta/Iceberg, meant to replace separate serving layers and caches. SiliconANGLE reports customers seeing up to <strong>16x better performance</strong> vs. existing real-time serving stacks, positioned as a drop-in upgrade for Lakehouse SQL warehouses (beta).</li>
</ul>
<p>Analysts characterized LTAP + Lakehouse//RT as Databricks <em>"declaring the end of pipelines"</em> between applications and analytics, particularly for agent-heavy workloads.</p>
<a href="https://www.youtube.com/watch?v=9J2-PovJppA" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/9J2-PovJppA/maxresdefault.jpg" alt="Introducing LTAP (Lake Transactional/Analytical Processing)" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Introducing LTAP: a new data processing architecture <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<a href="https://www.youtube.com/watch?v=L3_sGJRC674" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/L3_sGJRC674/maxresdefault.jpg" alt="Introducing Lakehouse//RT and Reyden, Reynold Xin" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Introducing Lakehouse//RT and Reyden, Reynold Xin, Co-founder & Chief Architect <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<h2 id="bi-and-analytics-including-power-bi-fabric-relevance"><span class="sec-num" aria-hidden="true">05</span>BI and analytics (including Power BI / Fabric relevance)</h2>
<h3 id="genie-for-aibi-and-business-workflows">Genie for AI/BI and business workflows</h3>
<p>Genie One extends beyond conversational analytics into <strong>doc/report generation, dashboards, scheduled briefs, and workflow automation</strong> grounded in governed data. It's embedded in Slack/Teams, has native mobile apps, and can be called as an MCP tool by external assistants, turning Databricks into a shared AI/BI backend.</p>
<p><strong>Customers:</strong> Uplight uses Genie One to "explore, discover and innovate" faster; Foot Locker uses Genie Agents as a central AI insights space for executives across banners; Albertsons uses Genie within a Merchandising Intelligence initiative for explainable decisions across the 4Ps.</p>
<h3 id="unity-catalog-metrics-and-semantics-for-bi">Unity Catalog Metrics and semantics for BI</h3>
<ul>
<li><strong>Metrics enhancements</strong>: multi-fact relationships (Public Preview in Dashboards), LOD calculations, parameterized metrics, richer window functions, and metric <strong>materialization</strong> (public preview) for faster dashboards and agent queries.</li>
<li><strong>Agentic/UI-driven authoring</strong>: a visual designer plus agents that propose metric definitions, lowering the barrier to semantic modeling.</li>
<li><strong>Import from third-party tools (Beta)</strong>: <strong>import models from Power BI and Tableau directly into Databricks</strong>, bootstrapping Metrics from existing BI semantics.</li>
<li><strong>Domains and Glossary</strong>: Domains (Public Preview) and an upcoming Glossary organize assets into business categories and feed Genie Ontology and agents.</li>
<li><strong>External lineage (GA)</strong>: end-to-end lineage now spans upstream sources and downstream BI tools.</li>
</ul>
<p>This is a critical bridge for <strong>Power BI/Fabric customers</strong>: you can keep existing semantic models while migrating workloads or running BI across platforms.</p>
<h3 id="real-time-bi">Real-time BI</h3>
<p>For BI teams, Lakehouse//RT + LTAP mean direct millisecond queries from BI tools against Delta/Iceberg without a separate serving database, and "fresh" analytics that sit directly on operational data (no ETL lag).</p>
<h2 id="governance-and-security"><span class="sec-num" aria-hidden="true">06</span>Governance and security</h2>
<h3 id="unity-catalog-control-context-choice">Unity Catalog: control, context, choice</h3>
<p>Unity Catalog's roadmap is framed around <strong>control, context, and choice</strong> in the agentic era:</p>
<ul>
<li><strong>Control</strong>: Unity AI Gateway; <strong>Governance Hub</strong> (Private Preview) for a centralized posture dashboard; <strong>ABAC expansions</strong> (grant policies for models, identity/context attributes, tag propagation); and opt-in <strong>RBAC</strong> (Public Preview soon).</li>
<li><strong>Context</strong>: Glossary, Domains, and Metrics build an open, OSI-ready semantic layer accessible via SQL, APIs, MCPs, and agents; External Lineage (GA) and Table Insights feed Genie Ontology.</li>
<li><strong>Choice</strong>: <strong>cross-cloud/region governance</strong> with a four-level namespace (<code>metastore.catalog.schema.table</code>); <strong>external engine writes</strong> to UC-managed Delta tables (Spark, Flink, DuckDB) via catalog commits; <strong>FILE type (Beta)</strong> for governing unstructured assets (PDFs, images, audio, video); and <strong>geospatial types (GA)</strong> in Delta and Iceberg v3.</li>
<li><strong>OpenSharing</strong>: announced as a Linux Foundation project, extending Delta Sharing to models, skills, and unstructured data.</li>
</ul>
<h3 id="platform-security-and-compliance">Platform security and compliance</h3>
<ul>
<li><strong>Automatic Identity Management (AIM)</strong>: Entra ID (GA on AWS/GCP) and Okta (Public Preview) auto-provision users, groups, and service principals.</li>
<li><strong>Context-Based Ingress (Public Preview)</strong>: zero-trust-style policies combining network, identity, and scope, plus expanded Inbound Private Link.</li>
<li><strong>Private Network Gateway</strong> (Private Preview on Azure) and <strong>Private Link for Lakebase</strong> (GA on AWS, Public Preview on Azure).</li>
<li><strong>Compliance expansion</strong>: HITRUST across AWS/Azure/GCP, ISMAP (Japan), extended KSA on GCP, expanded AWS GovCloud coverage for AI features, and forthcoming FedRAMP High on Azure Commercial.</li>
</ul>
<h3 id="lakewatch-and-the-panther-acquisition">Lakewatch and the Panther acquisition</h3>
<ul>
<li><strong>Lakewatch</strong> (agentic SIEM), formally launched earlier in 2026, was a major Summit theme. It unifies security, IT, and business data in one governed lakehouse with petabyte-scale retention and a claimed up to <strong>80% lower TCO</strong> vs. legacy SIEM, embedding security agents (via Agent Bricks + Genie Code) for automated triage, rule authoring, and investigation.</li>
<li><strong>Panther acquisition</strong>: Databricks announced intent to acquire Panther, an AI SOC platform with detection-as-code and 100+ security integrations, to accelerate the Security Lakehouse vision. Analysts see this as Databricks moving from a data platform <em>into</em> core security infrastructure.</li>
</ul>
<h2 id="partner-ecosystem"><span class="sec-num" aria-hidden="true">07</span>Partner ecosystem</h2>
<ul>
<li><strong>Microsoft / Azure Databricks</strong>: emphasis on modernizing Azure data estates and <strong>zero-copy federated analytics</strong>, combining Azure's enterprise cloud with Databricks' Lakehouse/Lakebase/Genie rather than redundant warehouses.</li>
<li><strong>AWS</strong>: returned as a "Legend Sponsor," highlighting co-built customer stories (e.g., Mastercard) and <strong>Bedrock + Databricks</strong> agent patterns (Bedrock AgentCore agents querying Unity Catalog, answering via Genie, reading low-latency state from Lakebase/Lakehouse//RT).</li>
<li><strong>GCP and others</strong>: expanded KSA compliance on GCP and a broad open ecosystem around Lakewatch (Okta, Zscaler, Wiz, Panther). OpenSharing and open table formats keep interop viable with third-party engines including Snowflake and Fabric-connected BI tools.</li>
</ul>
<h3 id="watch-customerlake-the-agentic-cdp">Watch: CustomerLake, the agentic CDP</h3>
<p>Among the vertical announcements, Databricks introduced <strong>CustomerLake</strong>, an agentic Customer Data Platform natively embedded in Databricks.</p>
<a href="https://www.youtube.com/watch?v=SUz4k1yxw1I" target="_blank" rel="noopener noreferrer" style="display:block;max-width:560px;margin:1.5rem 0;border-radius:14px;overflow:hidden;border:1px solid var(--color-border);box-shadow:var(--shadow-card);text-decoration:none;">
  <img src="https://img.youtube.com/vi/SUz4k1yxw1I/maxresdefault.jpg" alt="Introducing CustomerLake: The Agentic CDP" style="display:block;width:100%;margin:0;border-radius:0;" />
  <span style="display:block;padding:0.75rem 1rem;font-weight:600;background:var(--color-fill-1);">▶ Introducing CustomerLake: The Agentic CDP, Ali Ghodsi <span style="display:block;font-weight:400;font-size:0.9rem;color:var(--color-text-muted);">Databricks · YouTube</span></span>
</a>
<h2 id="top-announcements-timeline"><span class="sec-num" aria-hidden="true">08</span>Top announcements timeline</h2>
<p>Dates use press/blog publication dates; many were also demoed live in the June 15 Day 1 keynote.</p>
<div class="table-wrap" data-cols="3"><div class="table-scroll"><table>
<thead>
<tr>
<th align="left">Date (2026)</th>
<th align="left">Announcement</th>
<th align="left">Category</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Mar 24</td>
<td align="left">Lakewatch launch (agentic SIEM)</td>
<td align="left">Security</td>
</tr>
<tr>
<td align="left">Jun 2</td>
<td align="left">DAIS 2026 agenda &#x26; keynote lineup</td>
<td align="left">Event</td>
</tr>
<tr>
<td align="left">Jun 15</td>
<td align="left">Unity Catalog "What's new", AI Gateway, semantics, external writes, FILE type</td>
<td align="left">Governance</td>
</tr>
<tr>
<td align="left">Jun 15</td>
<td align="left">Lakeflow: a new era of agentic data engineering</td>
<td align="left">Data engineering</td>
</tr>
<tr>
<td align="left">Jun 15</td>
<td align="left">Genie One / Genie Ontology / Genie Agents (blog)</td>
<td align="left">AI/BI</td>
</tr>
<tr>
<td align="left">Jun 16</td>
<td align="left">Genie One press release, GA + usage-based pricing</td>
<td align="left">AI/BI</td>
</tr>
<tr>
<td align="left">Jun 16</td>
<td align="left">LTAP press release, architecture + Lakebase stats</td>
<td align="left">Architecture</td>
</tr>
<tr>
<td align="left">Jun 16</td>
<td align="left">Platform security &#x26; compliance "What's new"</td>
<td align="left">Security/platform</td>
</tr>
<tr>
<td align="left">Jun 16–17</td>
<td align="left">Lakewatch + Panther acquisition announced</td>
<td align="left">Security</td>
</tr>
<tr>
<td align="left">Jun 15–18</td>
<td align="left">Keynote: Lakehouse//RT, Reyden, CustomerLake, Omnigent</td>
<td align="left">Platform/vertical</td>
</tr>
</tbody>
</table></div></div>
<h2 id="five-trends-from-the-summit"><span class="sec-num" aria-hidden="true">09</span>Five trends from the summit</h2>
<ol>
<li><strong>From building agents to operating agentic systems.</strong> Unity AI Gateway, Genie Ontology, ZeroOps, Lakewatch, and Lakeflow together address runtime concerns, cost, guardrails, observability, and auto-remediation.</li>
<li><strong>Collapse of OLTP/OLAP and serving layers into LTAP.</strong> One storage copy, multiple engines, open formats, and strict isolation, going beyond "HTAP in a single engine."</li>
<li><strong>Governance and semantics as AI infrastructure.</strong> Unity Catalog moved from access control to runtime AI governance and semantic context; the catalog is now a <em>decision-maker</em> for AI, not just a registry.</li>
<li><strong>Data engineering becoming agentic and unified.</strong> Lakeflow consolidates ingestion, streaming, and orchestration, with Genie Code and ZeroOps automating authoring and operations, fewer standalone tools (Airflow, Kafka, proprietary CDC).</li>
<li><strong>Security converging with data and AI.</strong> Lakewatch + Panther push SIEM workloads onto the lakehouse, with security agents running alongside data and AI workloads.</li>
</ol>
<h2 id="competitive-analysis"><span class="sec-num" aria-hidden="true">10</span>Competitive analysis</h2>
<ul>
<li><strong>vs. Snowflake</strong>: LTAP's storage-centric unification (Postgres apps + open Delta/Iceberg) is explicitly contrasted with HTAP and "Zero-ETL" architectures that keep separate engines and hidden CDC. External engine writes, Iceberg v3 GA, and OpenSharing reinforce an open multi-engine story; Lakewatch + Panther position Databricks directly against SIEM players.</li>
<li><strong>vs. Microsoft Fabric</strong>: Azure Databricks content emphasizes modernizing Azure estates with zero-copy federated analytics rather than wholesale replacement. <strong>Metrics import from Power BI/Tableau</strong> is a clear bridge, and Genie One overlaps conceptually with Copilot for Power BI but stresses governed SQL, multi-app context, and usage-based economics over per-seat licensing.</li>
<li><strong>vs. point AI/MLOps tools</strong>: Genie, App Builder, and Agent Bricks compete with standalone agent frameworks by being tightly integrated into governance, security, and semantics; MLflow Tracing + Mosaic AI remain the evaluation backbone but are framed as parts of end-to-end agent platforms.</li>
</ul>
<h2 id="enterprise-implications"><span class="sec-num" aria-hidden="true">11</span>Enterprise implications</h2>
<h3 id="three-announcements-with-the-biggest-20262027-impact">Three announcements with the biggest 2026–2027 impact</h3>
<ol>
<li><strong>LTAP + Lakebase</strong>: if executed, unifying OLTP/OLAP/streaming on one governed storage copy can drastically reduce CDC/ETL complexity and time-to-production for AI apps. A multi-year journey for most, but a clear directional bet away from dual-stack architectures.</li>
<li><strong>Genie One + Ontology + Agents</strong>: Genie Ontology addresses the "context problem" by making governed data (not embeddings) the ground truth for reasoning, with large potential productivity gains if enterprises standardize on Genie for data-informed work.</li>
<li><strong>Unity AI Gateway + UC semantics</strong>: contextual policies, budgets with hard caps, and unified tracing respond directly to CFO/CISO concerns about uncontrolled LLM spend and agent risk.</li>
</ol>
<h3 id="three-announcements-most-relevant-to-power-bi-fabric-users">Three announcements most relevant to Power BI / Fabric users</h3>
<ol>
<li><strong>Unity Catalog Metrics + Power BI/Tableau import</strong>: centralize metrics and reuse them across Databricks SQL, Genie, and external BI while preserving existing definitions.</li>
<li><strong>Lakeflow + Power BI performance</strong>: Connect, Zerobus, and SDP Real-Time Mode offer a Fabric-like ingestion/transformation experience on the Lakehouse (Panasonic's 50% refresh-time improvement is the showcase).</li>
<li><strong>Lakehouse//RT + zero-copy analytics with Azure</strong>: low-latency queries on lakehouse data without replication to a separate serving store, aligning with the zero-copy federated analytics patterns Microsoft and Databricks jointly advocate.</li>
</ol>
<h3 id="practical-takeaways-by-role">Practical takeaways by role</h3>
<p><strong>Data engineers</strong>: Pilot Lakeflow Designer + SDP on non-critical pipelines; evaluate Zerobus as a Kafka replacement for high-volume producers; start capturing lineage via Lakeflow Connect + UC External Lineage to prepare for ZeroOps and data-aware orchestration. Medium term: rationalize Kafka/Airflow into Lakeflow Jobs and pressure-test Lakebase for greenfield transactional workloads.</p>
<p><strong>Analytics engineers / BI developers</strong>: Treat <strong>Unity Catalog Metrics</strong> and <strong>Domains</strong> as your new semantic modeling surface; import from Power BI/Tableau where it accelerates migration; explore Genie One/Agents for curated domains, starting with users who already live in Slack/Teams; test Lakehouse//RT for high-concurrency dashboards.</p>
<p><strong>AI/ML engineers</strong>: Standardize on <strong>Unity AI Gateway</strong> for model and tool access so budget and policy enforcement are centralized from day one; use <strong>Agent Bricks + Vector Search + MLflow Tracing</strong> for RAG observability; integrate Genie Ontology and UC semantics into prompting and tool choices.</p>
<p><strong>Architects / technical leaders</strong>: Map roadmaps to <strong>LTAP</strong> (where OLTP+OLAP unification on open storage is feasible over 2–3 years); build a governance strategy with Unity Catalog at the center (data, AI, security, cost); track Lakewatch + Panther integration timelines if you already centralize security data in Databricks.</p>
<h2 id="conclusions-and-predictions"><span class="sec-num" aria-hidden="true">12</span>Conclusions and predictions</h2>
<ul>
<li>Databricks is explicitly betting the lakehouse will be both the <strong>data layer</strong> <em>and</em> the <strong>runtime control plane</strong> for agents, apps, and security. LTAP, Unity AI Gateway, and Lakewatch all reinforce that strategy.</li>
<li>For 2026–2027, the likely near-term wins are in <strong>data engineering and AI/BI</strong>, not wholesale LTAP adoption. Lakeflow consolidation, Genie One deployment, and UC semantics can deliver value without touching core transactional systems.</li>
<li><strong>LTAP could be transformative but will land unevenly</strong>: cloud-native apps and new AI products are the most natural candidates; SaaS-heavy or vendor-locked workloads will migrate slower.</li>
<li><strong>Governance will increasingly be the differentiator</strong> across platforms, pushing competitors to match runtime policy, spend caps, and semantic openness.</li>
<li><strong>Security workloads will move closer to the data platform</strong>: if Lakewatch + Panther deliver, expect more SOCs to treat the lakehouse as their primary telemetry and detection surface.</li>
</ul>
<p>For teams already deep in Databricks, Power BI, and cloud data engineering, the immediate opportunity is to <strong>treat Databricks less as a warehouse and more as an agentic operating environment</strong>, incrementally adopting Lakeflow, Genie, and Unity Catalog semantics while planning if and where LTAP and Lakewatch fit your roadmap.</p>
<h2 id="what-i-actually-changed-after-the-summit"><span class="sec-num" aria-hidden="true">13</span>What I actually changed after the Summit</h2>
<p>A recap is only worth writing if it changes what you do on Monday. Here is what I actually revisited in my own work after DAIS 2026, separated from the announcements above so you can tell reporting from practice.</p>
<ul>
<li><strong>[TODO: confirm] Genie / semantic layer.</strong> [TODO: describe the specific change you made to how you expose metrics or semantic models after seeing Genie Ontology and the Power BI/Tableau metrics import, e.g. which models you registered in Unity Catalog and what it replaced.]</li>
<li><strong>[TODO: confirm] Lakeflow adoption.</strong> [TODO: state whether you moved any ingestion/orchestration onto Lakeflow, which connector or pipeline, and what it replaced (Airflow job, custom CDC, etc.).]</li>
<li><strong>[TODO: confirm] Unity Catalog governance.</strong> [TODO: note any concrete governance change: metric views, glossary/domains, spend caps via Unity AI Gateway, and the before/after.]</li>
<li><strong>[TODO: confirm] What I deliberately did <em>not</em> adopt yet.</strong> [TODO: name the announcement you decided to wait on (e.g. LTAP/Lakebase, Lakewatch) and the specific reason it is not on your near-term roadmap.]</li>
</ul>
<p><strong>[TODO: confirm] The one measurable outcome.</strong> [TODO: add a single number or before/after result from a change above, e.g. pipeline runtime, cost, or lines of glue code removed. If none yet, say what you will measure and when.]</p>
<h2 id="sources-official-and-reputable-coverage"><span class="sec-num" aria-hidden="true">14</span>Sources (official and reputable coverage)</h2>
<div class="table-wrap is-wide" data-cols="4"><div class="table-scroll"><table>
<thead>
<tr>
<th align="left">Topic</th>
<th align="left">Type</th>
<th align="left">Publisher</th>
<th align="left">Link</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">DAIS 2026 event site</td>
<td align="left">Official event</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/dataaisummit" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">2026 keynote lineup</td>
<td align="left">Press release</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/company/newsroom/press-releases/databricks-announces-2026-data-ai-summit-keynote-lineup-and" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Day 1 keynote (video)</td>
<td align="left">Keynote video</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.youtube.com/watch?v=Qux8E-L1mk8" target="_blank" rel="noopener noreferrer" class="table-link">youtube.com</a></td>
</tr>
<tr>
<td align="left">Day 2 keynote (video)</td>
<td align="left">Keynote video</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.youtube.com/watch?v=sn9My5Pj0mE" target="_blank" rel="noopener noreferrer" class="table-link">youtube.com</a></td>
</tr>
<tr>
<td align="left">Genie One / Ontology / Agents</td>
<td align="left">Product blog</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/blog/introducing-genie-one-genie-ontology-and-genie-agents" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Genie One launch</td>
<td align="left">Press release</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/company/newsroom/press-releases/databricks-launches-genie-one-all-new-agentic-coworker-every-team" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">LTAP launch</td>
<td align="left">Press release</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/company/newsroom/press-releases/databricks-launches-ltap-first-lake-transactionalanalytical" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Lakeflow: agentic data engineering</td>
<td align="left">Product blog</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/blog/lakeflow-new-era-agentic-data-engineering" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Lakeflow + Genie (video)</td>
<td align="left">Session video</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.youtube.com/watch?v=0WDGu-IPmZM" target="_blank" rel="noopener noreferrer" class="table-link">youtube.com</a></td>
</tr>
<tr>
<td align="left">What's new with Unity Catalog</td>
<td align="left">Product blog</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/blog/whats-new-unity-catalog-data-ai-summit-2026" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Platform security &#x26; compliance</td>
<td align="left">Product blog</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/blog/whats-new-databricks-platform-security-and-compliance-data-ai-summit-2026" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Lakewatch launch</td>
<td align="left">Press release</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/company/newsroom/press-releases/databricks-enters-security-market-launch-lakewatch-new-agentic-siem" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Lakewatch product page</td>
<td align="left">Product page</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/product/lakewatch" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">AWS + Databricks at DAIS 2026</td>
<td align="left">Blog</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.databricks.com/blog/aws-and-databricks-data-ai-summit-2026-accelerating-real-world-ai-innovation" target="_blank" rel="noopener noreferrer" class="table-link">databricks.com</a></td>
</tr>
<tr>
<td align="left">Azure Databricks at DAIS 2026</td>
<td align="left">Blog</td>
<td align="left">Microsoft</td>
<td align="left"><a href="https://techcommunity.microsoft.com/blog/azure-databricks/azure-databricks-at-databricks-data--ai-summit-2026-updates-and-new-announcement/4528388" target="_blank" rel="noopener noreferrer" class="table-link">techcommunity.microsoft.com</a></td>
</tr>
<tr>
<td align="left">CustomerLake (video)</td>
<td align="left">Keynote video</td>
<td align="left">Databricks</td>
<td align="left"><a href="https://www.youtube.com/watch?v=SUz4k1yxw1I" target="_blank" rel="noopener noreferrer" class="table-link">youtube.com</a></td>
</tr>
<tr>
<td align="left">LTAP &#x26; Lakehouse//RT coverage</td>
<td align="left">Article</td>
<td align="left">SiliconANGLE</td>
<td align="left"><a href="https://siliconangle.com/2026/06/16/databricks-declares-end-pipelines-unified-platform-operational-analytical-data/" target="_blank" rel="noopener noreferrer" class="table-link">siliconangle.com</a></td>
</tr>
<tr>
<td align="left">Lakehouse as agentic control plane</td>
<td align="left">Analysis</td>
<td align="left">Bain &#x26; Company</td>
<td align="left"><a href="https://www.bain.com/insights/databricks-data-ai-summit-the-lakehouse-becomes-the-agentic-enterprise-control-plane/" target="_blank" rel="noopener noreferrer" class="table-link">bain.com</a></td>
</tr>
<tr>
<td align="left">Summit announcements recap</td>
<td align="left">Recap</td>
<td align="left">Atlan</td>
<td align="left"><a href="https://atlan.com/know/ai-agent/databricks/databricks-data-ai-summit-2026-announcements/" target="_blank" rel="noopener noreferrer" class="table-link">atlan.com</a></td>
</tr>
<tr>
<td align="left">Panther acquisition</td>
<td align="left">News</td>
<td align="left">StorageNewsletter</td>
<td align="left"><a href="https://www.storagenewsletter.com/2026/06/17/data-ai-summit-2026-databricks-agrees-to-acquire-panther/" target="_blank" rel="noopener noreferrer" class="table-link">storagenewsletter.com</a></td>
</tr>
</tbody>
</table></div></div>
<p><em>Prioritize official Databricks sources; confirmed announcements are distinguished from analyst interpretation throughout this post.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>How to Build a Free Static Blog with Next.js and GitHub Pages</title>
      <link>https://bcastelino.com/blogs/blog/building-a-static-blog/</link>
      <guid isPermaLink="true">https://bcastelino.com/blogs/blog/building-a-static-blog/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <dc:creator>Brian Castelino</dc:creator>
      <category>open-source</category>
      <category>meta</category>
      <description><![CDATA[A step-by-step guide to building a fast static blog with Next.js, Markdown, and CSS Modules, then deploying it free on GitHub Pages with GitHub Actions.]]></description>
      <content:encoded><![CDATA[<p>A static blog is a website made of pre-built HTML, CSS, and JavaScript files with no server or database behind it. Everything is generated at build time, so it loads fast, costs nothing to host, and is hard to break. This guide shows how I built this blog with Next.js and deployed it free on GitHub Pages.</p>
<h2 id="the-stack-nextjs-markdown-and-github-pages"><span class="sec-num" aria-hidden="true">01</span>The stack: Next.js, Markdown, and GitHub Pages</h2>
<p>I wanted a fast, good-looking blog that costs nothing to host and is trivial to update. A static site on free hosting is the obvious answer. Here is the stack:</p>
<ul>
<li><strong>Next.js (App Router)</strong> exported to static HTML with <code>output: 'export'</code>.</li>
<li><strong>CSS Modules</strong> with an OKLCH design-token system for theming.</li>
<li><strong>Markdown</strong> files compiled at build time with <code>remark</code>.</li>
<li><strong>GitHub Pages</strong> for hosting, with <strong>GitHub Actions</strong> for automatic deploys.</li>
</ul>
<h2 id="why-use-nextjs-static-export-for-a-blog"><span class="sec-num" aria-hidden="true">02</span>Why use Next.js static export for a blog</h2>
<p>GitHub Pages only serves static files, with no servers or databases. Next.js handles this with a single config flag:</p>
<pre><code class="language-js">// next.config.mjs
const nextConfig = {
  output: 'export',
  basePath: '/blogs',
  images: { unoptimized: true },
};
</code></pre>
<p>Because the site lives at a sub-path (<code>/blogs</code>), I set a <code>basePath</code> so every asset and link URL resolves correctly.</p>
<h2 id="how-to-write-posts-in-markdown"><span class="sec-num" aria-hidden="true">03</span>How to write posts in Markdown</h2>
<p>Each post is a Markdown file with a small frontmatter block:</p>
<pre><code class="language-md">---
title: My Post
date: 2026-06-20
excerpt: A short summary.
tags: [example]
author: Brian Castelino
authorUrl: https://www.linkedin.com/in/cas7elino/
---

Your content here.
</code></pre>
<p><code>author</code> and <code>authorUrl</code> are optional. If you omit them, every post defaults to my name linked to my LinkedIn, so the byline stays consistent across the site.</p>
<p>The build reads every file in <code>content/posts</code>, generates a static page for each, and lists them on the home page sorted by date.</p>
<h2 id="how-to-deploy-a-nextjs-blog-to-github-pages"><span class="sec-num" aria-hidden="true">04</span>How to deploy a Next.js blog to GitHub Pages</h2>
<p>Deployment runs automatically through GitHub Actions on every push to <code>main</code>:</p>
<ol>
<li>Push your new post to the <code>main</code> branch.</li>
<li>A GitHub Actions workflow runs <code>next build</code>, which exports the site to the <code>out/</code> folder.</li>
<li>The workflow publishes <code>out/</code> to GitHub Pages.</li>
<li>Wait about a minute, and the post is live.</li>
</ol>
<p>That is the whole system: simple, fast, and free.</p>
<h2 id="related-reading"><span class="sec-num" aria-hidden="true">05</span>Related reading</h2>
<p>New here? Start with <a href="../welcome-to-my-blog/">why I built The Brian Journal</a>, or read my first deep dive on <a href="../databricks-data-ai-summit-2026/">Databricks Data + AI Summit 2026</a>.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>