<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases</id>
    <title>CAIPE Blog</title>
    <updated>2026-06-05T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases"/>
    <subtitle>CAIPE Blog</subtitle>
    <icon>https://cnoe-io.github.io/ai-platform-engineering/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Release 0.5.8 — Skills FGA, catalog API keys BFF, and RBAC migrations]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8"/>
        <updated>2026-06-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Chart//ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.8 (when published)]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.8</code> (when published)
Previous release: 0.5.4</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.5.8 continues enterprise RBAC work: skill team shares reconcile through the shared OpenFGA shareable-resource module, catalog API keys can be minted from the CAIPE UI BFF without the supervisor, and admin ReBAC migrations cover agent/skill FGA backfills. See the upgrade guide below for the <strong>catalog API key hash</strong> change before upgrading production.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-and-catalog">Skills and catalog<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#skills-and-catalog" class="hash-link" aria-label="Direct link to Skills and catalog" title="Direct link to Skills and catalog" translate="no">​</a></h3>
<ul>
<li class=""><strong>Catalog API keys in the BFF</strong> — mint, list, and revoke keys via <code>/api/catalog-api-keys</code> without proxying to the supervisor (see breaking change if you already minted keys).</li>
<li class=""><strong>Skill FGA reconcile</strong> — per-skill team shares use the shared <code>reconcileShareableResource</code> path; admin migration <code>agent_skill_openfga_reconcile_v1</code> backfills owner and team tuples from Mongo.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rbac">RBAC<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#rbac" class="hash-link" aria-label="Direct link to RBAC" title="Direct link to RBAC" translate="no">​</a></h3>
<ul>
<li class=""><strong>Agent <code>user:*</code> wildcard</strong> — visibility changes correctly add/remove org-wide grants on dynamic agents.</li>
<li class=""><strong>Skills team sharing</strong> — members can team-share skills from the Skill Builder with the same teams picker pattern as agents and knowledge bases.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="catalog-api-key-hash">Catalog API key hash<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#catalog-api-key-hash" class="hash-link" aria-label="Direct link to Catalog API key hash" title="Direct link to Catalog API key hash" translate="no">​</a></h3>
<p>Stored catalog API key digests changed algorithm:</p>
<table><thead><tr><th></th><th>Before</th><th>After (0.5.8)</th></tr></thead><tbody><tr><td><strong>Algorithm</strong></td><td>SHA-256 of <code>pepper + ":" + secret</code></td><td>HMAC-SHA256 with <code>CAIPE_CATALOG_API_KEY_PEPPER</code> (or <code>SKILLS_API_KEY_PEPPER</code>) as the HMAC key</td></tr><tr><td><strong>BFF</strong></td><td>N/A or legacy proxy</td><td><code>ui/src/lib/catalog-api-keys.ts</code></td></tr><tr><td><strong>Python</strong></td><td><code>skills_middleware/api_keys_store.py</code></td><td>Same HMAC format as BFF</td></tr></tbody></table>
<p><strong>Impact:</strong> Any row in the <code>catalog_api_keys</code> collection created before this change will <strong>fail verification</strong> after upgrade. Clients must receive a <strong>newly minted</strong> key.</p>
<p><strong>Not affected:</strong> Key <em>format</em> on the wire is unchanged (<code>{key_id}.{secret}</code>). Pepper env vars are unchanged; only how the secret is hashed at rest changed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class="">Catalog key hashing uses HMAC-SHA256 and unbiased <code>randomInt</code> for secret generation (CodeQL-hardened).</li>
<li class="">Set <code>CAIPE_CATALOG_API_KEY_PEPPER</code> to a long random value in production (see <code>ui/env.example</code>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None documented for this pre-release note.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.8 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-054--058">Upgrade Guide: 0.5.4 → 0.5.8<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#upgrade-guide-054--058" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.5.4 → 0.5.8" title="Direct link to Upgrade Guide: 0.5.4 → 0.5.8" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Most deployments can upgrade the chart first, then run admin ReBAC migrations from <strong>Admin → ReBAC migrations</strong>. If you use <strong>catalog API keys</strong> (Skills Gateway / <code>X-Caipe-Catalog-Key</code>), plan a short key rotation window — see <a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#catalog-api-key-hash" class="">Catalog API key hash</a> below.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="catalog-api-key-hash-1">Catalog API key hash<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#catalog-api-key-hash-1" class="hash-link" aria-label="Direct link to Catalog API key hash" title="Direct link to Catalog API key hash" translate="no">​</a></h2>
<p><strong>Required when:</strong> the <code>catalog_api_keys</code> MongoDB collection contains keys minted before 0.5.8 (BFF or supervisor).</p>
<p><strong>Skip when:</strong> the collection is empty or you do not use catalog API keys.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-confirm-pepper-is-set-consistently">1. Confirm pepper is set consistently<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#1-confirm-pepper-is-set-consistently" class="hash-link" aria-label="Direct link to 1. Confirm pepper is set consistently" title="Direct link to 1. Confirm pepper is set consistently" translate="no">​</a></h3>
<p>Use the same pepper on the CAIPE UI (BFF) and any Python path that validates keys (supervisor / skills middleware):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># ui deployment / secret</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">CAIPE_CATALOG_API_KEY_PEPPER</span><span class="token operator">=</span><span class="token operator">&lt;</span><span class="token plain">openssl rand </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-hex</span><span class="token plain"> </span><span class="token number">3</span><span class="token operator file-descriptor important">2</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># skills middleware / supervisor (if applicable)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">SKILLS_API_KEY_PEPPER</span><span class="token operator">=</span><span class="token operator">&lt;</span><span class="token plain">same value</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>Do not change the pepper during rotation unless you intend to invalidate all keys.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-rotate-keys">2. Rotate keys<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#2-rotate-keys" class="hash-link" aria-label="Direct link to 2. Rotate keys" title="Direct link to 2. Rotate keys" translate="no">​</a></h3>
<p>For each active key:</p>
<ol>
<li class="">In the UI (or via API), <strong>revoke</strong> the old <code>key_id</code>.</li>
<li class=""><strong>Mint</strong> a new key and distribute the new <code>{key_id}.{secret}</code> to clients (CI, local <code>CAIPE_CATALOG_KEY</code>, install scripts, etc.).</li>
<li class="">Update automation that cached the old secret.</li>
</ol>
<p>Optional (dev/test only): drop the collection and re-mint from scratch:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// MongoDB — destructive; production use revoke + mint instead</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">db</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">catalog_api_keys</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">deleteMany</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-sS</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"X-Caipe-Catalog-Key: &lt;new-key&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://&lt;your-ui&gt;/api/skills/catalog"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">head</span><br></span></code></pre></div></div>
<p>Expect <code>200</code> (or your normal catalog response), not <code>401</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>Document full <code>values.yaml</code> diff when the 0.5.8 chart is published. Set catalog pepper via existing UI/skills env wiring (see <code>ui/env.example</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>Run pending migrations from <strong>Admin → ReBAC migrations</strong>, including when applicable:</p>
<ul>
<li class=""><code>agent_skill_openfga_reconcile_v1</code> — backfill skill owner/team FGA tuples</li>
<li class=""><code>agent_shared_team_grants_backfill_v1</code> — agent <code>shared_with_teams</code> → OpenFGA</li>
<li class="">Other 0.5.8 manifest entries shown as <strong>behind</strong> in the migrations UI</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-rotate-catalog-api-keys-if-used">1. Rotate catalog API keys (if used)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#1-rotate-catalog-api-keys-if-used" class="hash-link" aria-label="Direct link to 1. Rotate catalog API keys (if used)" title="Direct link to 1. Rotate catalog API keys (if used)" translate="no">​</a></h3>
<p>Complete <a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#catalog-api-key-hash" class="">Catalog API key hash</a> <strong>before</strong> or immediately after deploy so clients are not left with invalid keys.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-update-chart-version">2. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#2-update-chart-version" class="hash-link" aria-label="Direct link to 2. Update chart version" title="Direct link to 2. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.8 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-run-rebac-migrations">3. Run ReBAC migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#3-run-rebac-migrations" class="hash-link" aria-label="Direct link to 3. Run ReBAC migrations" title="Direct link to 3. Run ReBAC migrations" translate="no">​</a></h3>
<p>Use the admin migrations UI with the confirmation strings shown per migration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-verify">4. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.8#4-verify" class="hash-link" aria-label="Direct link to 4. Verify" title="Direct link to 4. Verify" translate="no">​</a></h3>
<ul>
<li class="">Skills list/catalog with a new catalog API key</li>
<li class="">Team-shared skills visible to team members after FGA reconcile migration</li>
<li class="">Dynamic agent global/team visibility behaves as expected</li>
</ul>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.5.2 — RAG Access Control and Gateway Routing]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2"/>
        <updated>2026-05-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-29]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-29
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.2</code>
Previous release: 0.5.1</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.5.2 completes the OpenFGA relationship-based access model for RAG and Knowledge Bases — knowledge bases can now be shared with teams, every Knowledge sidebar tab is gated on a real OpenFGA capability, and the RAG server and BFF enforce deny-by-default. AgentGateway gains an MCP route bridge so platform MCP endpoints (including the built-in Knowledge Base server) can be rendered straight from Helm, and the default now routes all gateway-managed MCP servers through the gateway. Keycloak adds strict client-secret reconciliation for production installs and a migration-health panel in the admin UI, while a RAG ingestor SSRF fix and pinned TLS dependencies harden the web loader.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="knowledge-base--rag-access-control">Knowledge Base &amp; RAG Access Control<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#knowledge-base--rag-access-control" class="hash-link" aria-label="Direct link to Knowledge Base &amp; RAG Access Control" title="Direct link to Knowledge Base &amp; RAG Access Control" translate="no">​</a></h3>
<ul>
<li class=""><strong>Complete RAG OpenFGA access model</strong> — adds knowledge-base sharing, per-resource gates, and RAG server/BFF enforcement, plus <code>data_source</code> and <code>mcp_tool</code> universal OpenFGA types and a BFF list filter; the Graph tab is gated on any-KB-readable and Knowledge sidebar tabs render per-tab gates with empty states (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1591" target="_blank" rel="noopener noreferrer" class="">#1591</a>)</li>
<li class=""><strong>Route capabilities in the canonical model</strong> — OpenFGA consolidates to a single canonical chart model artifact and adds organization route-capability relations for fine-grained application gates (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1592" target="_blank" rel="noopener noreferrer" class="">#1592</a>)</li>
<li class=""><strong>Deny-by-default cleanup</strong> — removes legacy RAG group fallback propagation from setup and migration docs so local and Helm installs stay aligned with deny-by-default OpenFGA behavior (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1601" target="_blank" rel="noopener noreferrer" class="">#1601</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentgateway-mcp-routing">AgentGateway MCP Routing<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#agentgateway-mcp-routing" class="hash-link" aria-label="Direct link to AgentGateway MCP Routing" title="Direct link to AgentGateway MCP Routing" translate="no">​</a></h3>
<ul>
<li class=""><strong>MCP route bridge for RBAC runtimes</strong> — a config bridge syncs compose MCP routes, and Helm now renders MCP route targets including a built-in <code>knowledgeBaseTarget</code> and arbitrary <code>extraMcpTargets</code> (one <code>AgentgatewayBackend</code> + <code>HTTPRoute</code> per entry, <code>/mcp/&lt;id&gt;</code> → static <code>host:port</code>) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1595" target="_blank" rel="noopener noreferrer" class="">#1595</a>)</li>
<li class=""><strong>Secret-backed backend auth env</strong> — new <code>agentgateway.extraEnv</code> / <code>extraEnvFrom</code> let the standalone AgentGateway config resolve backend-auth placeholders (e.g. <code>GITHUB_PERSONAL_ACCESS_TOKEN</code>, <code>GITLAB_PERSONAL_ACCESS_TOKEN</code>) from Kubernetes secrets (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1595" target="_blank" rel="noopener noreferrer" class="">#1595</a>)</li>
<li class=""><strong>CRD-free routing by default</strong> — new <code>global.agentgateway.routingMode</code> defaults to <code>static</code>, which renders the standalone proxy's config (one <code>/mcp/&lt;id&gt;</code> route/backend per target) instead of Gateway API/AgentGateway custom resources. Enabling AgentGateway therefore no longer requires the <code>gateway.networking.k8s.io</code>/<code>agentgateway.dev</code> CRDs or a controller, keeping <code>helm diff</code>/<code>helm upgrade</code> clean on clusters you do not own; MCP endpoints stay discoverable via the proxy admin <code>/config</code> endpoint consumed by the UI discover/sync flow. Set <code>routingMode: gateway-api</code> to opt back into the controller-managed Gateway data plane (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1629" target="_blank" rel="noopener noreferrer" class="">#1629</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication--keycloak">Authentication &amp; Keycloak<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#authentication--keycloak" class="hash-link" aria-label="Direct link to Authentication &amp; Keycloak" title="Direct link to Authentication &amp; Keycloak" translate="no">​</a></h3>
<ul>
<li class=""><strong>Strict client-secret reconciliation</strong> — managed Keycloak client secrets are reconciled for production installs, with strict-secret test coverage and updated Slack bot Keycloak helper behavior (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1593" target="_blank" rel="noopener noreferrer" class="">#1593</a>)</li>
<li class=""><strong>Keycloak migration health surfaces</strong> — new migration-health summary APIs, an admin UI panel, and header/release signals for diagnosing realm migration state (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1597" target="_blank" rel="noopener noreferrer" class="">#1597</a>)</li>
<li class=""><strong>withAuth routes mapped to RBAC capabilities</strong> — protected BFF route groups now map to explicit OpenFGA capabilities and require Slack/Webex resource read access before returning access-check details (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1594" target="_blank" rel="noopener noreferrer" class="">#1594</a>)</li>
<li class=""><strong>Centralized local-dev auth bypass</strong> — a single dev-auth provider replaces the <code>CAIPE_UNSAFE_RBAC_BYPASS</code> checks that were scattered across the API middleware, RAG proxy, OpenFGA helpers, and admin/UI gates; the bypass admin principal is returned only when <code>SSO_ENABLED=false</code>, <code>ALLOW_DEV_ADMIN_WHEN_SSO_DISABLED=true</code>, and <code>CAIPE_UNSAFE_RBAC_BYPASS=true</code> are all set outside production (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1613" target="_blank" rel="noopener noreferrer" class="">#1613</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="admin-ui">Admin UI<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#admin-ui" class="hash-link" aria-label="Direct link to Admin UI" title="Direct link to Admin UI" translate="no">​</a></h3>
<ul>
<li class=""><strong>Slack onboarding redesign</strong> — the admin Slack experience is reorganized into Configured / Onboard / Advanced tabs (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1613" target="_blank" rel="noopener noreferrer" class="">#1613</a>)</li>
<li class=""><strong>Hardened ReBAC assignment</strong> — ReBAC assignment operations in the admin UI are hardened and the OpenFGA inspector uses exact tuple filters (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1613" target="_blank" rel="noopener noreferrer" class="">#1613</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-review">AI Review<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#ai-review" class="hash-link" aria-label="Direct link to AI Review" title="Direct link to AI Review" translate="no">​</a></h3>
<ul>
<li class=""><strong>Overhauled review rubrics</strong> — the default AI Review rubric for agent system prompts expands from 7 to 11 criteria (adding negative-constraints, failure-mode-handling, prompt-injection-resistance, and more), and the SKILL.md rubric expands to 11 criteria emphasizing trigger conditions, actionable instructions, and bounded scope; weights now reflect real importance (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1608" target="_blank" rel="noopener noreferrer" class="">#1608</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-defaults">Configuration Defaults<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#configuration-defaults" class="hash-link" aria-label="Direct link to Configuration Defaults" title="Direct link to Configuration Defaults" translate="no">​</a></h3>
<ul>
<li class=""><strong>Bedrock AI assist defaults to Claude Haiku 4.5</strong> — local setup and AI assist fallbacks now default to Claude Haiku 4.5 on Bedrock; the stale Claude 3.5 Bedrock seed model is removed while Sonnet remains available as an explicit option (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1605" target="_blank" rel="noopener noreferrer" class="">#1605</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>dynamic-agents</strong>: forward caller bearer tokens through MCP httpx clients so user JWTs reach downstream MCP servers (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1598" target="_blank" rel="noopener noreferrer" class="">#1598</a>)</li>
<li class=""><strong>dynamic-agents</strong>: show an inline required-field message (with TeamPicker ARIA hooks) when creating a dynamic agent without an owner team (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1606" target="_blank" rel="noopener noreferrer" class="">#1606</a>)</li>
<li class=""><strong>credentials</strong>: align the OAuth service factory and Mongo envelope-store defaults (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1600" target="_blank" rel="noopener noreferrer" class="">#1600</a>)</li>
<li class=""><strong>keycloak</strong>: correctly type the management-permissions enabled flag (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1597" target="_blank" rel="noopener noreferrer" class="">#1597</a>)</li>
<li class=""><strong>setup-caipe</strong>: honor declined prompts — <code>ENABLE_INGRESS=false</code> and <code>ENABLE_METALLB=false</code> are now set when the user answers "No", instead of always installing both (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1587" target="_blank" rel="noopener noreferrer" class="">#1587</a>)</li>
<li class=""><strong>setup-caipe</strong>: use the native Anthropic model ID for Claude Haiku 4.5 — the previous <code>-v1:0</code> Bedrock inference-profile suffix was rejected by the native Anthropic API (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1542" target="_blank" rel="noopener noreferrer" class="">#1542</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>rag-ingestors</strong>: block SSRF by rejecting non-public web-loader start and redirect URLs, and pin Twisted for TLS compatibility, with regression coverage (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1599" target="_blank" rel="noopener noreferrer" class="">#1599</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.5.1.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.2 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-051--052">Upgrade Guide: 0.5.1 → 0.5.2<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#upgrade-guide-051--052" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.5.1 → 0.5.2" title="Direct link to Upgrade Guide: 0.5.1 → 0.5.2" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.5.2 is a drop-in upgrade — no <code>values.yaml</code> edits are required. The chart adds new optional AgentGateway routing keys (all with working defaults) and changes one default: gateway-managed MCP servers now route through AgentGateway by default. The bulk of the release is RAG/Knowledge Base OpenFGA access control and Keycloak hardening, none of which require values changes for existing deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No breaking Helm values changes between 0.5.1 and 0.5.2. The diff is limited to new optional AgentGateway keys and one changed default.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-agentgateway-mcp-routing">New Optional: AgentGateway MCP Routing<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#new-optional-agentgateway-mcp-routing" class="hash-link" aria-label="Direct link to New Optional: AgentGateway MCP Routing" title="Direct link to New Optional: AgentGateway MCP Routing" translate="no">​</a></h3>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>global.agentgateway.knowledgeBaseTarget.enabled</code></td><td><code>true</code></td><td>Render a built-in Knowledge Base MCP route aligned with the RAG server MCP backend</td></tr><tr><td><code>global.agentgateway.knowledgeBaseTarget.host</code></td><td><code>rag-server.{{ .Release.Namespace }}.svc.cluster.local</code></td><td>Upstream host for the Knowledge Base MCP route</td></tr><tr><td><code>global.agentgateway.knowledgeBaseTarget.port</code></td><td><code>9446</code></td><td>Upstream port</td></tr><tr><td><code>global.agentgateway.knowledgeBaseTarget.protocol</code></td><td><code>StreamableHTTP</code></td><td>MCP transport protocol</td></tr><tr><td><code>global.agentgateway.knowledgeBaseTarget.pathPrefix</code></td><td><code>/mcp/knowledge-base</code></td><td>Route path prefix</td></tr><tr><td><code>global.agentgateway.extraMcpTargets</code></td><td><code>[]</code></td><td>Additional MCP routes not rendered from <code>agent-*</code> subcharts; one <code>AgentgatewayBackend</code> + <code>HTTPRoute</code> per entry</td></tr><tr><td><code>agentgateway.extraEnv</code></td><td><code>[]</code></td><td>Secret-backed env for backend-auth placeholders in the standalone AgentGateway config</td></tr><tr><td><code>agentgateway.extraEnvFrom</code></td><td><code>[]</code></td><td><code>envFrom</code> sources for the AgentGateway container</td></tr></tbody></table>
<p>These default to safe values; no action is required unless you want to route additional platform MCP endpoints or wire backend-auth secrets (e.g. <code>GITHUB_PERSONAL_ACCESS_TOKEN</code>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="default-changed-agentgateway-mcp-server-ids">Default Changed: AgentGateway MCP Server IDs<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#default-changed-agentgateway-mcp-server-ids" class="hash-link" aria-label="Direct link to Default Changed: AgentGateway MCP Server IDs" title="Direct link to Default Changed: AgentGateway MCP Server IDs" translate="no">​</a></h3>
<p><strong>Affected key</strong>: <code>dynamic-agents</code> config <code>AGENT_GATEWAY_MCP_SERVER_IDS</code></p>
<p><strong>Before (0.5.1)</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">AGENT_GATEWAY_MCP_SERVER_IDS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"jira"</span><br></span></code></pre></div></div>
<p><strong>After (0.5.2)</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">AGENT_GATEWAY_MCP_SERVER_IDS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"all"</span><br></span></code></pre></div></div>
<p><strong>Action</strong>: None required. <code>"all"</code> only applies to gateway-managed MCP rows; manual/direct MCP rows keep their stored endpoint so tool names still reflect their real upstreams. If you previously relied on only Jira being routed through the shared AgentGateway backend, pin this back to <code>"jira"</code> (or your explicit list) in your <code>dynamic-agents</code> config.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required. The RAG OpenFGA access model and route capabilities are reconciled by the chart; deny-by-default behavior applies once the canonical model is loaded.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.2 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-pin-agentgateway-mcp-routing">2. (Optional) Pin AgentGateway MCP routing<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#2-optional-pin-agentgateway-mcp-routing" class="hash-link" aria-label="Direct link to 2. (Optional) Pin AgentGateway MCP routing" title="Direct link to 2. (Optional) Pin AgentGateway MCP routing" translate="no">​</a></h3>
<p>If you do not want all gateway-managed MCP servers routed through AgentGateway, set <code>AGENT_GATEWAY_MCP_SERVER_IDS</code> back to an explicit list in your <code>dynamic-agents</code> config. To route extra platform MCP endpoints, populate <code>global.agentgateway.extraMcpTargets</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Confirm the Knowledge Base MCP route / AgentGateway backend is healthy</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get httproute </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> mcp</span><br></span></code></pre></div></div>
<p>Check that OpenFGA-gated Knowledge sidebar tabs and Graph access resolve as expected for your teams — KBs now require explicit sharing under deny-by-default.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.2#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.5.1 → 0.5.2)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">--- /tmp/vf-0.5.2.yaml	2026-05-29 09:12:26</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">+++ /tmp/vt-0.5.2.yaml	2026-05-29 09:12:28</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">@@ -132,6 +132,28 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      serviceName: "ai-platform-engineering-openfga-authz-bridge"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      serviceNamespace: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      port: 9100</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Built-in Knowledge Base MCP route. This keeps the Dynamic Agents</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # `knowledge-base` MCP server ID aligned with the RAG server MCP backend</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # when AgentGateway is enabled in the umbrella chart.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    knowledgeBaseTarget:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      host: "rag-server.{{ .Release.Namespace }}.svc.cluster.local"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      port: 9446</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      pathPrefix: /mcp/knowledge-base</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Additional MCP routes that are not rendered from `agent-*` subcharts.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Use this for platform MCP endpoints such as RAG/Knowledge Base.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Each item renders one AgentgatewayBackend and one HTTPRoute:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #   /mcp/&lt;id&gt; -&gt; static host:port using the requested MCP protocol.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Example:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # extraMcpTargets:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #   - id: knowledge-base</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #     host: "{{ .Release.Name }}-rag-server.{{ .Release.Namespace }}.svc.cluster.local"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #     port: 9446</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #     protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    #     pathPrefix: /mcp/knowledge-base</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    extraMcpTargets: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # OpenFGA service discovery defaults for CAIPE components that perform</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # relationship-based authorization or reconciliation.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -145,6 +167,23 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    repository: cr.agentgateway.dev/agentgateway</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    tag: v1.1.0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    pullPolicy: IfNotPresent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Secret-backed environment for backend auth placeholders used by the</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # standalone AgentGateway config, for example:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #   backendAuth:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     key: "$GITHUB_PERSONAL_ACCESS_TOKEN"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     key: "$GITLAB_PERSONAL_ACCESS_TOKEN"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  extraEnv: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # - name: GITHUB_PERSONAL_ACCESS_TOKEN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #   valueFrom:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     secretKeyRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #       name: github-mcp-secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #       key: GITHUB_PERSONAL_ACCESS_TOKEN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # - name: GITLAB_PERSONAL_ACCESS_TOKEN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #   valueFrom:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     secretKeyRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #       name: gitlab-mcp-secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #       key: GITLAB_PERSONAL_ACCESS_TOKEN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  extraEnvFrom: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # LangGraph Redis for checkpoint and cross-thread store persistence.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # Two deployment options:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -1056,9 +1095,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    CREDENTIAL_API_URL: "http://ai-platform-engineering-caipe-ui:3000/api/credentials"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    CREDENTIAL_SERVICE_AUDIENCE: "caipe-credential-service"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    USE_IMPERSONATION_TOKENS: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    # MCP server IDs routed through the shared AgentGateway backend.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    # Other MCP servers keep direct endpoints so tool names reflect real upstreams.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    AGENT_GATEWAY_MCP_SERVER_IDS: "jira"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # MCP server IDs routed through AgentGateway. "all" only applies to</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # gateway-managed MCP rows; manual/direct MCP rows keep their stored endpoint.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    AGENT_GATEWAY_MCP_SERVER_IDS: "all"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # LLM configuration (override if needed)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # LLM_PROVIDER: "openai"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # LLM_MODEL: "gpt-4o"</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.5.3 — CRD-Free Gateway and Release-Name Defaults]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3"/>
        <updated>2026-05-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-29]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-29
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.3</code>
Previous release: 0.5.2</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.5.3 makes AgentGateway CRD-free by default. The new <code>global.agentgateway.routingMode</code> defaults to <code>static</code>, so enabling the gateway renders the standalone proxy's own config instead of Gateway API / AgentGateway custom resources — no cluster-scoped CRDs and no controller install required, which keeps <code>helm diff</code> and <code>helm upgrade</code> clean on clusters you do not own. The chart also stops hardcoding <code>ai-platform-engineering-*</code> service URLs: in-cluster defaults are now computed from the Helm release name in the deployment templates, so installs under a custom release name resolve their supervisor, Keycloak, OpenFGA, skill-scanner, and bot URLs correctly without manual overrides. Rounding out the release, every agent gains proper Kubernetes startup/liveness/readiness probe semantics, and a Twisted bump closes a DNS-compression DoS in the RAG web loader.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentgateway-routing">AgentGateway Routing<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#agentgateway-routing" class="hash-link" aria-label="Direct link to AgentGateway Routing" title="Direct link to AgentGateway Routing" translate="no">​</a></h3>
<ul>
<li class=""><strong>CRD-free static routing by default</strong> — <code>global.agentgateway.routingMode</code> now defaults to <code>static</code>, which writes MCP routes into the standalone AgentGateway proxy's static config (one <code>/mcp/&lt;id&gt;</code> route/backend per target) instead of rendering <code>Gateway</code>, <code>HTTPRoute</code>, <code>AgentgatewayBackend</code>, and <code>AgentgatewayPolicy</code> custom resources. Enabling AgentGateway therefore no longer depends on the <code>gateway.networking.k8s.io</code> / <code>agentgateway.dev</code> CRDs or a Gateway controller; MCP endpoints stay discoverable through the proxy admin <code>/config</code> endpoint that the CAIPE UI discover/sync flow reads. A new <code>global.agentgateway.static.jwtAuth</code> block adds optional listener-level JWT validation for the standalone proxy, and the UI recovers each MCP route path from the live <code>pathPrefix</code> shape. Set <code>routingMode: gateway-api</code> to opt back into the controller-managed Gateway data plane (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1629" target="_blank" rel="noopener noreferrer" class="">#1629</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-release-name-defaults">Helm Release-Name Defaults<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#helm-release-name-defaults" class="hash-link" aria-label="Direct link to Helm Release-Name Defaults" title="Direct link to Helm Release-Name Defaults" translate="no">​</a></h3>
<ul>
<li class=""><strong>Release-name-aware service URLs</strong> — in-cluster service URL defaults that were previously hardcoded to <code>ai-platform-engineering-*</code> (or a literal <code>{{ .Release.Name }}</code> string) are now left empty and computed from the actual Helm release name inside the deployment templates. This covers the supervisor (<code>A2A_BASE_URL</code>), Keycloak (<code>KEYCLOAK_URL</code>), OpenFGA (<code>httpUrl</code> / <code>OPENFGA_HTTP</code>), skill-scanner (<code>SKILL_SCANNER_URL</code>), the Slack and Webex bot admin APIs, the credential service, the SLIM endpoint, and the OpenFGA authz-bridge JWKS URL — so a <code>helm install foo …</code> resolves to <code>foo-keycloak</code>, <code>foo-openfga</code>, and so on instead of silently pointing at the wrong service. Realm URL defaults also honor <code>KEYCLOAK_REALM</code> instead of a hardcoded <code>caipe</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1612" target="_blank" rel="noopener noreferrer" class="">#1612</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="health--probes">Health &amp; Probes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#health--probes" class="hash-link" aria-label="Direct link to Health &amp; Probes" title="Direct link to Health &amp; Probes" translate="no">​</a></h3>
<ul>
<li class=""><strong>Real Kubernetes probe semantics across agents</strong> — agents migrate from TCP to HTTP probes and gain startup probes; the supervisor registers <code>/health</code> and <code>/ready</code> routes on the A2A app, dynamic-agents and rag-server get corrected liveness semantics, skill-scanner and langgraph-redis get startup probes, and readiness endpoints now return HTTP 503 when their dependencies are unavailable so traffic is held off until a pod is genuinely ready (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1468" target="_blank" rel="noopener noreferrer" class="">#1468</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docs">Docs<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#docs" class="hash-link" aria-label="Direct link to Docs" title="Direct link to Docs" translate="no">​</a></h3>
<ul>
<li class=""><strong>Versioned docs generated at build time</strong> — the documentation site now materializes versioned docs from release tags at build time rather than committing <code>versioned_docs/</code> trees, and the RBAC reference's broken anchor and unreadable draw.io SVGs are repaired</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>ui</strong>: recover the AgentGateway MCP route path from the live <code>pathPrefix</code> shape so discovered routes match the proxy config (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1629" target="_blank" rel="noopener noreferrer" class="">#1629</a>)</li>
<li class=""><strong>helm</strong>: wire the CAIPE UI to the AgentGateway proxy for CRD-free MCP discovery (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1629" target="_blank" rel="noopener noreferrer" class="">#1629</a>)</li>
<li class=""><strong>helm</strong>: fix whitespace trimming that caused YAML parse errors in deployment env blocks and compute release-name service URL defaults in templates (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1612" target="_blank" rel="noopener noreferrer" class="">#1612</a>)</li>
<li class=""><strong>ui</strong>: collapse the top bar on narrow screens and label the collapsed nav menu</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>rag</strong>: bump Twisted to 26.4.0 to close a DNS-compression denial-of-service in the web loader</li>
<li class=""><strong>deps</strong>: bump PyJWT from 2.10.1 to 2.13.0 in the OpenFGA authz bridge, and force <code>uuid &gt;= 11.1.1</code> via overrides in the UI and docs builds</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p><strong>AgentGateway routing defaults to <code>static</code> (CRD-free).</strong> If you run with <code>global.agentgateway.enabled: true</code> and rely on the chart rendering Gateway API / AgentGateway custom resources (the controller-managed data plane), you must now set <code>global.agentgateway.routingMode: gateway-api</code> explicitly. With the default <code>global.agentgateway.enabled: false</code>, there is no impact.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.3 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-052--053">Upgrade Guide: 0.5.2 → 0.5.3<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#upgrade-guide-052--053" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.5.2 → 0.5.3" title="Direct link to Upgrade Guide: 0.5.2 → 0.5.3" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>For a stock deployment — default release name <code>ai-platform-engineering</code>, AgentGateway disabled — 0.5.3 is a drop-in upgrade. Two things are worth knowing before you upgrade: the AgentGateway <code>routingMode</code> default flipped to <code>static</code>, and many in-cluster service URL defaults are now computed from the Helm release name instead of being hardcoded. Neither changes behavior for the default release name, but both matter if you enable AgentGateway or run under a custom release name.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="behavioral-change-agentgateway-routingmode">Behavioral Change: AgentGateway <code>routingMode</code><a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#behavioral-change-agentgateway-routingmode" class="hash-link" aria-label="Direct link to behavioral-change-agentgateway-routingmode" title="Direct link to behavioral-change-agentgateway-routingmode" translate="no">​</a></h3>
<p><strong>Affected key</strong>: <code>global.agentgateway.routingMode</code> (new key, defaults to <code>static</code>)</p>
<p><strong>Before (0.5.2)</strong>: enabling AgentGateway rendered Gateway API / AgentGateway custom resources (required the CRDs + a controller).</p>
<p><strong>After (0.5.3)</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">global</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">agentgateway</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">routingMode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> static   </span><span class="token comment" style="color:rgb(98, 114, 164)"># NEW default — no CRDs, no controller</span><br></span></code></pre></div></div>
<p><strong>Action</strong>: If you depend on the controller-managed Gateway data plane (Gateway API CRs), set <code>routingMode: gateway-api</code> explicitly. Otherwise no action — <code>static</code> requires no CRDs and keeps <code>helm upgrade</code> clean.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed-defaults-release-name-service-urls">Changed Defaults: Release-Name Service URLs<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#changed-defaults-release-name-service-urls" class="hash-link" aria-label="Direct link to Changed Defaults: Release-Name Service URLs" title="Direct link to Changed Defaults: Release-Name Service URLs" translate="no">​</a></h3>
<p>A set of service URL keys changed their default from a literal <code>ai-platform-engineering-*</code> / <code>{{ .Release.Name }}</code> string to an empty string (<code>""</code>), because the value is now rendered from <code>.Release.Name</code> in the deployment templates. Affected keys include <code>global.slim.endpoint</code>, <code>global.openfga.httpUrl</code>, CAIPE UI <code>A2A_BASE_URL</code> / <code>SKILL_SCANNER_URL</code> / <code>SLACK_BOT_ADMIN_URL</code> / <code>WEBEX_BOT_ADMIN_URL</code>, dynamic-agents <code>KEYCLOAK_URL</code> / <code>OPENFGA_HTTP</code> / <code>CREDENTIAL_API_URL</code>, the Slack/Webex bot <code>CAIPE_API_URL</code>, the Webex admin issuer/JWKS URLs, and the OpenFGA authz-bridge <code>httpUrl</code> / <code>tokenValidation.jwksUrl</code>.</p>
<p><strong>Action</strong>:</p>
<ul>
<li class=""><strong>Default release name (<code>ai-platform-engineering</code>)</strong>: none — the rendered value is identical to the old hardcoded default.</li>
<li class=""><strong>Custom release name</strong>: you can now <em>remove</em> any manual overrides you previously added to point these at <code>&lt;release&gt;-…</code>; the empty default resolves correctly on its own.</li>
<li class="">If you explicitly set any of these to an external endpoint, your override is preserved.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-fields">New Optional Fields<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#new-optional-fields" class="hash-link" aria-label="Direct link to New Optional Fields" title="Direct link to New Optional Fields" translate="no">​</a></h3>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>global.agentgateway.static.jwtAuth.enabled</code></td><td><code>false</code></td><td>Listener-level JWT validation for the standalone proxy (static routing mode)</td></tr><tr><td><code>global.agentgateway.static.jwtAuth.issuer</code> / <code>jwksUrl</code> / <code>audiences</code></td><td><code>""</code> / <code>""</code> / <code>[]</code></td><td>JWT issuer, JWKS URL, and audiences for the static listener policy</td></tr><tr><td><code>dynamic-agents</code> <code>OPENFGA_HTTP</code></td><td><code>""</code> (release-name default)</td><td>OpenFGA HTTP endpoint for dynamic-agents authorization</td></tr><tr><td><code>dynamic-agents</code> <code>OPENFGA_STORE_NAME</code></td><td><code>caipe-openfga</code></td><td>OpenFGA store name for dynamic-agents</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.3 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-only-if-you-use-agentgateway-with-crds-pin-routing-mode">2. (Only if you use AgentGateway with CRDs) Pin routing mode<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#2-only-if-you-use-agentgateway-with-crds-pin-routing-mode" class="hash-link" aria-label="Direct link to 2. (Only if you use AgentGateway with CRDs) Pin routing mode" title="Direct link to 2. (Only if you use AgentGateway with CRDs) Pin routing mode" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">global</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">agentgateway</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">routingMode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gateway</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">api</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Probes are stricter now — confirm pods reach Ready and stay there</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> wide</span><br></span></code></pre></div></div>
<p>If AgentGateway is enabled in static mode, confirm MCP routes resolve through the proxy admin <code>/config</code> endpoint (the UI discover/sync flow reads from there) rather than expecting <code>HTTPRoute</code> objects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.3#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.5.2 → 0.5.3)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">@@ global.slim @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    endpoint: "http://ai-platform-engineering-slim:46357"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    endpoint: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token coord">@@ global.agentgateway @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    routingMode: static</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    static:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      jwtAuth:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">        enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">        issuer: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">        jwksUrl: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">        audiences: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    extAuth:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">      serviceName: "ai-platform-engineering-openfga-authz-bridge"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      serviceName: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token coord">@@ global.openfga @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    httpUrl: "http://{{ .Release.Name }}-openfga:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    httpUrl: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token coord">@@ caipe-ui.config @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    A2A_BASE_URL: "http://ai-platform-engineering-supervisor-agent:8000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    A2A_BASE_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    SKILL_SCANNER_URL: "http://{{ .Release.Name }}-skill-scanner:8000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SKILL_SCANNER_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    SLACK_BOT_ADMIN_URL: "http://ai-platform-engineering-slack-bot:3001"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_BOT_ADMIN_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    WEBEX_BOT_ADMIN_URL: "http://ai-platform-engineering-webex-bot:3002"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_BOT_ADMIN_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token coord">@@ dynamic-agents.config @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    KEYCLOAK_URL: "http://ai-platform-engineering-keycloak:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_HTTP: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_STORE_NAME: "caipe-openfga"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    CREDENTIAL_API_URL: "http://ai-platform-engineering-caipe-ui:3000/api/credentials"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_API_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token coord">@@ slack-bot.config / webex-bot.config @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    CAIPE_API_URL: "http://ai-platform-engineering-caipe-ui:3000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_API_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    WEBEX_ADMIN_JWT_ISSUER: "http://ai-platform-engineering-keycloak:8080/realms/caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    WEBEX_ADMIN_JWKS_URL: "http://ai-platform-engineering-keycloak:8080/realms/caipe/protocol/openid-connect/certs"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_JWT_ISSUER: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_JWKS_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token coord">@@ openfga-authz-bridge @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    httpUrl: "http://{{ .Release.Name }}-openfga:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    httpUrl: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">    jwksUrl: "http://{{ .Release.Name }}-keycloak:8080/realms/caipe/protocol/openid-connect/certs"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    jwksUrl: ""</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.5.4 — Admin UI Polish and Keycloak Realm Fix]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4"/>
        <updated>2026-05-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-29]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-29
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.4</code>
Previous release: 0.5.3</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.5.4 is a small maintenance release focused on admin UI consistency and a Keycloak fix. Native agent and team <code>&lt;select&gt;</code> controls are replaced with the shared searchable picker components, and the Slack and Webex admin panels are consolidated into a single <code>ConnectorAdminPanel</code>, so connector management looks and behaves the same everywhere. Team cards now surface knowledge-base, agent, and tool counts at a glance, the team Knowledge tab's create links point at the correct <code>/knowledge-bases</code> route, and Keycloak renders the configured realm name instead of assuming <code>caipe</code>. There are no <code>values.yaml</code> changes — this is a drop-in upgrade from 0.5.3.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="admin-ui">Admin UI<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#admin-ui" class="hash-link" aria-label="Direct link to Admin UI" title="Direct link to Admin UI" translate="no">​</a></h3>
<ul>
<li class=""><strong>Shared pickers and connector panels</strong> — native agent/team <code>&lt;select&gt;</code> elements are replaced with the shared searchable picker components, and the Slack (<code>SlackChannelRebacPanel</code>) and Webex (<code>WebexSpaceRebacPanel</code>) admin panels are DRYed up into one shared <code>ConnectorAdminPanel</code>, giving both connectors identical ReBAC management UX (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1632" target="_blank" rel="noopener noreferrer" class="">#1632</a>)</li>
<li class=""><strong>Team card resource counts</strong> — team cards now show knowledge-base, agent, and tool counts so admins can see a team's footprint without opening it (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1643" target="_blank" rel="noopener noreferrer" class="">#1643</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>admin</strong>: point the team Knowledge tab create links at <code>/knowledge-bases</code> instead of a stale route (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1643" target="_blank" rel="noopener noreferrer" class="">#1643</a>)</li>
<li class=""><strong>keycloak</strong>: render the configured realm name instead of the hardcoded <code>caipe</code> default (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1657" target="_blank" rel="noopener noreferrer" class="">#1657</a>)</li>
<li class=""><strong>compose</strong>: remove a duplicate <code>volumes</code> key in the <code>openfga-init</code> service that broke <code>docker compose</code> parsing (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1638" target="_blank" rel="noopener noreferrer" class="">#1638</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<p>No security-specific changes in this release.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.5.3.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.4 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-053--054">Upgrade Guide: 0.5.3 → 0.5.4<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#upgrade-guide-053--054" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.5.3 → 0.5.4" title="Direct link to Upgrade Guide: 0.5.3 → 0.5.4" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.5.4 is a drop-in upgrade — no <code>values.yaml</code> edits are required. The release is limited to UI refactors, two admin fixes, a Keycloak realm-name fix, and a Docker Compose parsing fix. There are no chart value changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.5.3 and 0.5.4. The <code>helm show values</code> output is byte-for-byte identical.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.4 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>If you run Keycloak under a non-<code>caipe</code> realm name, confirm the admin UI and bot integrations now reflect the configured realm.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.4#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<p>No Helm values changes between 0.5.3 and 0.5.4 — drop-in upgrade.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.5.1 — Fine-Grained Knowledge Base RBAC]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1"/>
        <updated>2026-05-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-27]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-27
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.1</code>
Previous release: 0.5.0</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.5.1 makes OpenFGA the source of truth for human access to the RAG knowledge base surfaces — Search, Data Sources, Graph, and MCP Tools — and lets admins share individual knowledge bases with teams through relationship-based grants. Under the hood, team membership is consolidated into a single canonical store so every reader and writer agrees on who belongs to a team, eliminating the drift that caused authorized users to fall back to the Default CAIPE Supervisor instead of their configured agent. The release also adds a searchable team picker across admin panels, a friendlier first-run experience that seeds a working Hello-World agent, and an intentionally noisy emergency flag to bypass UI RBAC while repairing an OpenFGA/Keycloak stack.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fine-grained-knowledge-base-access-control">Fine-Grained Knowledge Base Access Control<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#fine-grained-knowledge-base-access-control" class="hash-link" aria-label="Direct link to Fine-Grained Knowledge Base Access Control" title="Direct link to Fine-Grained Knowledge Base Access Control" translate="no">​</a></h3>
<ul>
<li class=""><strong>OpenFGA-backed KB access</strong> — Search, Data Sources, Graph, and MCP Tools now resolve human access through OpenFGA instead of legacy role/group/trusted-network checks, making one consistent decision across the UI, BFF, and RAG server (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
<li class=""><strong>Share knowledge bases with teams</strong> — admins can grant teams access to individual knowledge bases through an OpenFGA reconciler with backfill for already-shared KBs (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
<li class=""><strong>New <code>data_source</code> and <code>mcp_tool</code> resource types</strong> — added as first-class OpenFGA types with BFF list filtering, so users only see the data sources and tools they can actually use (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
<li class=""><strong>Per-tab Knowledge sidebar gates</strong> — each Knowledge tab is gated on the relevant OpenFGA relation with empty states instead of access-denied dead ends; the Graph tab unlocks when any KB is readable (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
<li class=""><strong>Explicit org-admin super-grant</strong> — org admins keep access to KB, Search, Data Sources, Graph, and MCP Tools, including the grant needed to create a datasource before its ownership tuples exist (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="canonical-team-membership--onboarding">Canonical Team Membership &amp; Onboarding<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#canonical-team-membership--onboarding" class="hash-link" aria-label="Direct link to Canonical Team Membership &amp; Onboarding" title="Direct link to Canonical Team Membership &amp; Onboarding" translate="no">​</a></h3>
<ul>
<li class=""><strong>Single source of truth for membership</strong> — the duplicate <code>teams.members[]</code> array is retired in favor of the canonical <code>team_membership_sources</code> collection; every auth gate, API consumer, and admin view now reads from it, and <code>GET /api/admin/teams</code> returns a canonical <code>member_count</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
<li class=""><strong>Searchable team picker</strong> — new <code>TeamPicker</code> and <code>TeamMultiPicker</code> components replace native <code>&lt;select&gt;</code> dropdowns across admin panels for team selection and "Share with Teams" (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
<li class=""><strong>Persisted onboarding defaults</strong> — admins can choose default teams and agents with an explicit Save flow and clear pending-changes affordance, and agent "Share with Teams" is persisted in OpenFGA with a one-shot backfill (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
<li class=""><strong>Working first-run experience</strong> — fresh installs seed a default Hello-World agent and an auto-create-teams sync rule, with opt-in login-time team auto-creation via <code>IDENTITY_SYNC_LOGIN_AUTO_CREATE_TEAMS</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="operational-safety">Operational Safety<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#operational-safety" class="hash-link" aria-label="Direct link to Operational Safety" title="Direct link to Operational Safety" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>CAIPE_UNSAFE_RBAC_BYPASS</code> escape hatch</strong> — an intentionally noisy dev/emergency flag that allows UI RBAC checks without consulting OpenFGA/Keycloak, for recovering a 0.5.x install while the RBAC stack is being repaired; defaults to <code>false</code> and emits a one-time server warning when enabled (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1581" target="_blank" rel="noopener noreferrer" class="">#1581</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>rbac</strong>: complete the RAG OpenFGA access model so the RAG server enforces the same team/KB relationships as the UI and BFF (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
<li class=""><strong>rbac</strong>: read knowledge-base tuples with a valid paginated OpenFGA query, and grant <code>ingestor</code> on shared knowledge bases so team members can re-ingest (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1584" target="_blank" rel="noopener noreferrer" class="">#1584</a>)</li>
<li class=""><strong>rbac/ui</strong>: let read-only viewers load the configured default platform agent — fixes "Generic user sees Default CAIPE Supervisor instead of the configured Hello World agent," caused by the BFF mapping every <code>/api/admin/*</code> GET to an admin-only gate before the route's own <code>system_config#read</code> check ran (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
<li class=""><strong>dynamic-agents</strong>: surface LLM configuration errors over SSE instead of a generic "something went wrong," so Slack/Webex/UI show the actionable message (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
<li class=""><strong>slack-bot</strong>: relay specific dynamic-agent errors (LLM config, RBAC denial) and stop silently retrying behind a generic toast (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
<li class=""><strong>rbac</strong>: chunk OpenFGA writes and make identity-group-sync apply transactionally, so large-realm syncs no longer fail on write limits or leave half-applied state (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1583" target="_blank" rel="noopener noreferrer" class="">#1583</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class="">Authorization for knowledge-base surfaces is now centralized on OpenFGA, reducing the chance that the UI, BFF, and RAG server make different access decisions for the same user.</li>
<li class="">The new <code>CAIPE_UNSAFE_RBAC_BYPASS</code> flag is a deliberate escape hatch: it defaults to <code>false</code>, logs a loud one-time warning when enabled, and is documented as unsafe for staging or production.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.5.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.1 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-050--051">Upgrade Guide: 0.5.0 → 0.5.1<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#upgrade-guide-050--051" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.5.0 → 0.5.1" title="Direct link to Upgrade Guide: 0.5.0 → 0.5.1" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Drop-in upgrade — no <code>values.yaml</code> edits are required. 0.5.1 adds a small set of new optional RBAC environment variables on <code>caipe-ui</code> and <code>rag-server</code>, all with working defaults. The only behavior worth noting is that the RAG server now ships with team-scoped RBAC enabled by default (<code>RBAC_TEAM_SCOPE_ENABLED: "true"</code>); if your OpenFGA model is already initialized (as expected on 0.5.x), this aligns RAG access with the UI with no action needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No keys were renamed, removed, or changed type between 0.5.0 and 0.5.1. The diff only adds new optional fields.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-fields">New Optional Fields<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#new-optional-fields" class="hash-link" aria-label="Direct link to New Optional Fields" title="Direct link to New Optional Fields" translate="no">​</a></h3>
<p><strong><code>caipe-ui</code> config</strong> — adds the emergency RBAC bypass flag:</p>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>CAIPE_UNSAFE_RBAC_BYPASS</code></td><td><code>"false"</code></td><td>When <code>true</code>, UI RBAC checks allow all requests without consulting OpenFGA. Dev/emergency only — never enable in staging or production.</td></tr></tbody></table>
<p><strong><code>rag-stack.rag-server.env</code></strong> — a new env block wires the RAG server to OpenFGA:</p>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>RBAC_TEAM_SCOPE_ENABLED</code></td><td><code>"true"</code></td><td>Enforce team-scoped RBAC on RAG server requests via OpenFGA.</td></tr><tr><td><code>OPENFGA_HTTP</code></td><td><code>"http://ai-platform-engineering-openfga:8080"</code></td><td>OpenFGA endpoint the RAG server queries for KB/team relationships.</td></tr><tr><td><code>OPENFGA_STORE_NAME</code></td><td><code>"caipe-openfga"</code></td><td>OpenFGA store name.</td></tr><tr><td><code>CAIPE_UNSAFE_RBAC_BYPASS</code></td><td><code>"false"</code></td><td>Same emergency escape hatch as the UI, applied to RAG server RBAC.</td></tr></tbody></table>
<p>If you override <code>rag-server.env</code> in your own values, merge these keys in rather than replacing the block. Operators on an air-gapped or renamed OpenFGA service should point <code>OPENFGA_HTTP</code> at their endpoint.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deprecated--removed-keys">Deprecated / Removed Keys<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#deprecated--removed-keys" class="hash-link" aria-label="Direct link to Deprecated / Removed Keys" title="Direct link to Deprecated / Removed Keys" translate="no">​</a></h3>
<p>None.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations are required to upgrade. The canonical team-membership refactor reads from the <code>team_membership_sources</code> collection; a migration script (<code>make</code> target) is available to clear the legacy <code>teams.members[]</code> array, but it is optional cleanup and not required for the upgrade.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.1 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-point-the-rag-server-at-a-non-default-openfga">2. (Optional) Point the RAG server at a non-default OpenFGA<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#2-optional-point-the-rag-server-at-a-non-default-openfga" class="hash-link" aria-label="Direct link to 2. (Optional) Point the RAG server at a non-default OpenFGA" title="Direct link to 2. (Optional) Point the RAG server at a non-default OpenFGA" translate="no">​</a></h3>
<p>If your OpenFGA service is not the in-release default, set the new env keys under <code>rag-stack.rag-server.env</code> in your <code>values.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">rag-stack</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">rag-server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">RBAC_TEAM_SCOPE_ENABLED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">OPENFGA_HTTP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://your-openfga:8080"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">OPENFGA_STORE_NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"caipe-openfga"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>Then confirm a team member can open the Knowledge tabs they have access to, and that the configured default agent loads for non-admin users instead of falling back to the Default CAIPE Supervisor.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.1#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.5.0 → 0.5.1)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">--- values-0.5.0.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">+++ values-0.5.1.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">@@ -836,6 +836,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    OPENFGA_HTTP: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    OPENFGA_STORE_NAME: "caipe-openfga"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    OPENFGA_RECONCILE_ENABLED: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Unsafe dev/emergency escape hatch: when true, UI RBAC checks allow all</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # requests without consulting OpenFGA. Do not enable in staging or prod.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_UNSAFE_RBAC_BYPASS: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Keycloak Admin API integration for resource/scope synchronization.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    KEYCLOAK_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    KEYCLOAK_REALM: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -1412,6 +1415,11 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      # tag defaults to .Chart.AppVersion when not specified</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      tag: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    env:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      RBAC_TEAM_SCOPE_ENABLED: "true"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      OPENFGA_HTTP: "http://ai-platform-engineering-openfga:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      OPENFGA_STORE_NAME: "caipe-openfga"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      CAIPE_UNSAFE_RBAC_BYPASS: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  agent-rag:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    enabled: true</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.5.0 — Enterprise RBAC and OpenFGA Authorization]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0"/>
        <updated>2026-05-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-26]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-26
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.5.0</code>
Previous release: 0.4.18</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.5.0 is a headline minor release that lands CAIPE's enterprise authorization foundation: a full cutover from legacy role-based access control to relationship-based access control (ReBAC) backed by OpenFGA, with Keycloak as the identity provider and an AgentGateway ext_authz bridge enforcing per-call MCP decisions. The release introduces a new Webex bot alongside ReBAC-aware Slack routing, an envelope-encrypted credential store and OAuth connector platform, and a hardened secrets bootstrap that fails loudly on dev placeholders instead of silently shipping insecure defaults. The entire authorization stack is <strong>opt-in and disabled by default</strong> — for a stock 0.4.18 deployment this is a drop-in upgrade with no <code>values.yaml</code> edits required. Operators who adopt RBAC get team-based access control, per-document RAG ACLs, channel-derived team binding for bots, and a redesigned admin UI for managing teams, identity-group sync, and onboarding defaults.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="identity--authorization-openfga-rebac">Identity &amp; Authorization (OpenFGA ReBAC)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#identity--authorization-openfga-rebac" class="hash-link" aria-label="Direct link to Identity &amp; Authorization (OpenFGA ReBAC)" title="Direct link to Identity &amp; Authorization (OpenFGA ReBAC)" translate="no">​</a></h3>
<ul>
<li class=""><strong>OpenFGA ReBAC core, admin BFF, and admin UI</strong> — new <code>ui/src/lib/rbac</code> library (OpenFGA client, tuple builder, store, PDP, decision cache, role-mapping, group-sync, team/agent resolvers, Keycloak Admin REST helpers), the full admin BFF API surface, and admin UI components for teams and authorization management (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1526" target="_blank" rel="noopener noreferrer" class="">#1526</a>)</li>
<li class=""><strong>Auth foundation Helm charts</strong> — brand-new <code>keycloak</code>, <code>openfga</code>, <code>openfga-authz-bridge</code>, and <code>agentgateway</code> subcharts, including Keycloak realm init, token-exchange and auth-reconcile jobs, the OpenFGA authorization model bootstrap, and the Python ext_authz bridge (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1496" target="_blank" rel="noopener noreferrer" class="">#1496</a>)</li>
<li class=""><strong>Shared MCP agent-auth library</strong> — new <code>mcp-agent-auth</code> package (JWT validation, caller-key derivation, OBO exchange, in-process JWKS cache, downstream token forwarder, PDP) wired uniformly into 13 agent MCP servers via <code>MCPAuthMiddleware</code> (Spec 101) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1524" target="_blank" rel="noopener noreferrer" class="">#1524</a>)</li>
<li class=""><strong>RAG ReBAC with per-document ACLs</strong> — OpenFGA-backed authorization for the RAG server, ACL propagation through every ingestor, per-document enforcement at retrieval time, and a userinfo cache for the OBO-validation hot path (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1525" target="_blank" rel="noopener noreferrer" class="">#1525</a>)</li>
<li class=""><strong><code>admin</code> implies <code>member</code> + auto-provisioned Super Admins team</strong> — OpenFGA model bump so anyone with the <code>admin</code> relation on a team satisfies <code>team#member</code> checks, removing the need to dual-write tuples; a Super Admins team is auto-provisioned for platform defaults (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1555" target="_blank" rel="noopener noreferrer" class="">#1555</a>)</li>
<li class=""><strong>Persisted onboarding defaults</strong> — default team and agent for new users stored in <code>platform_config</code> and editable from the admin UI/BFF (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1558" target="_blank" rel="noopener noreferrer" class="">#1558</a>)</li>
<li class=""><strong>Admin-configurable discovery cache TTL</strong> — tune the Slack/Webex onboarding discovery cache from the admin UI (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1556" target="_blank" rel="noopener noreferrer" class="">#1556</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bots-webex--slack-rebac">Bots: Webex + Slack ReBAC<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#bots-webex--slack-rebac" class="hash-link" aria-label="Direct link to Bots: Webex + Slack ReBAC" title="Direct link to Bots: Webex + Slack ReBAC" translate="no">​</a></h3>
<ul>
<li class=""><strong>New Webex bot integration</strong> — full <code>webex_bot</code> integration (a2a client, app, identity linking, audit, hardening, Prometheus metrics) plus a <code>webex-bot</code> Helm subchart, Dockerfile, and CI workflow (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1523" target="_blank" rel="noopener noreferrer" class="">#1523</a>)</li>
<li class=""><strong>Slack ReBAC additions</strong> — channel-team resolver, JIT identity linking, SSE OBO, runtime policy, and opt-in first-message channel onboarding for unmapped channels (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1523" target="_blank" rel="noopener noreferrer" class="">#1523</a>)</li>
<li class=""><strong>Channel-derived team binding</strong> — replaces the single-team <code>active_team</code> JWT claim with a model that derives the authorizing team from the channel/context (Slack channel, Webex space, DM), correct for multi-team users by construction; adds personal DM commands across both bots (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1562" target="_blank" rel="noopener noreferrer" class="">#1562</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connections--credentials">Connections &amp; Credentials<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#connections--credentials" class="hash-link" aria-label="Direct link to Connections &amp; Credentials" title="Direct link to Connections &amp; Credentials" translate="no">​</a></h3>
<ul>
<li class=""><strong>Envelope-encrypted credential store + OAuth platform</strong> — MongoDB-backed envelope-encrypted credential storage with KMS-style data-key wrapping (AES-GCM with a master key), an OAuth connector platform (built-in providers, token refresh, state store, provider detection), and a Python credential-exchange client for agents; gated behind the <code>CAIPE_CREDENTIALS_ENABLED</code> feature flag and disabled by default (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1497" target="_blank" rel="noopener noreferrer" class="">#1497</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents">Dynamic Agents<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#dynamic-agents" class="hash-link" aria-label="Direct link to Dynamic Agents" title="Direct link to Dynamic Agents" translate="no">​</a></h3>
<ul>
<li class=""><strong>JWT/OBO auth + OpenFGA PDP gate</strong> — JWKS validation middleware, on-behalf-of token exchange, request-local token context, and a ReBAC PDP gate bring the dynamic-agents runtime to parity with the rest of the auth surface (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1499" target="_blank" rel="noopener noreferrer" class="">#1499</a>)</li>
<li class=""><strong>MCP endpoint normalizer + self-heal</strong> — canonicalizes MCP URLs from bot configs (trailing slash, <code>/mcp</code> suffix, scheme inference), forwards request tokens via OBO, resolves credential refs, and adds probe + self-heal diagnostics (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1499" target="_blank" rel="noopener noreferrer" class="">#1499</a>)</li>
<li class=""><strong>Editor blocker hints + protected platform default agent</strong> — surfaces blocker hints in the agent editor and prevents deletion/misconfiguration of the platform default agent (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1559" target="_blank" rel="noopener noreferrer" class="">#1559</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supervisor">Supervisor<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#supervisor" class="hash-link" aria-label="Direct link to Supervisor" title="Direct link to Supervisor" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>get_file_line_count</code> tool</strong> — new tool the agent is prompted to call before <code>read_file</code>, so it reads large files in bounded ranges instead of pulling entire files into context (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1565" target="_blank" rel="noopener noreferrer" class="">#1565</a>)</li>
<li class=""><strong>User identity + JWT forwarding</strong> — opt-in <code>ENABLE_USER_INFO_TOOL</code> captures user identity from the JWT (enabling the <code>user_info</code> tool and JWT context middleware); <code>FORWARD_JWT_TO_MCP</code> forwards the user JWT as a Bearer token to HTTP/streamable-HTTP MCP connections. Both default to <code>false</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1524" target="_blank" rel="noopener noreferrer" class="">#1524</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup" translate="no">​</a></h3>
<ul>
<li class=""><strong>Expanded embeddings menu</strong> — <code>setup-caipe.sh</code> now offers all 7 <code>EmbeddingsFactory</code> providers, including AWS Bedrock, Cohere, and Voyage AI (the recommended embeddings provider for Anthropic Claude users) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1538" target="_blank" rel="noopener noreferrer" class="">#1538</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>rbac</strong>: scoped team admins can now edit, delete, and configure their own team — previously group admins could not modify anything within their own group (issue <a href="https://github.com/cnoe-io/ai-platform-engineering/issues/1509" target="_blank" rel="noopener noreferrer" class="">#1509</a>, fixed in <a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1567" target="_blank" rel="noopener noreferrer" class="">#1567</a>)</li>
<li class=""><strong>ui/slack</strong>: drop stale env-provided Slack default agent/team and surface a warning instead of silently honoring removed defaults (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1539" target="_blank" rel="noopener noreferrer" class="">#1539</a>)</li>
<li class=""><strong>ui</strong>: use <code>users.conversations</code> for Slack channel discovery to dodge Slack API rate limits (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1536" target="_blank" rel="noopener noreferrer" class="">#1536</a>)</li>
<li class=""><strong>chart/caipe-ui</strong>: include <code>workflow_configs</code> in the app configmap so self-service workflows render correctly (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1549" target="_blank" rel="noopener noreferrer" class="">#1549</a>)</li>
<li class=""><strong>setup-caipe</strong>: pull the Ollama embedding model during setup so local embeddings work out of the box (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1553" target="_blank" rel="noopener noreferrer" class="">#1553</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<p>This release is security-heavy by design — it ships the authorization stack and hardens the secrets bootstrap.</p>
<ul>
<li class=""><strong>Keycloak client-secret hardening</strong> — adds a reconcile pass that rotates dev placeholder secrets for the three confidential service-account clients (<code>caipe-platform</code>, <code>caipe-slack-bot</code>, <code>caipe-webex-bot</code>) on every install/upgrade, a strict-mode gate (<code>keycloak.strictClientSecrets</code>, default off) that fails the install if any known dev placeholder still mints a token, ExternalSecrets support for <code>caipe-platform.OIDC_CLIENT_SECRET</code>, and removal of 5 demo users with hardcoded passwords from the bundled realm config (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1518" target="_blank" rel="noopener noreferrer" class="">#1518</a>)</li>
<li class=""><strong>Kill BFF <code>admin/admin</code> fallback + strict-mode gates</strong> — the BFF Keycloak Admin client no longer falls back to <code>admin/admin</code> against <code>/realms/master</code>; production requires the <code>client_credentials</code> path against a confidential client and fails loudly otherwise. Adds MongoDB and NextAuth strict-mode gates, and auto-wires <code>KEYCLOAK_ADMIN_CLIENT_ID</code>/<code>SECRET</code> from the same Secret the Keycloak chart writes (R1/R3/R4 of the May 2026 secrets audit) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1519" target="_blank" rel="noopener noreferrer" class="">#1519</a>)</li>
<li class=""><strong>Envelope-encrypted credentials</strong> — credentials are stored with AES-GCM envelope encryption and KMS-style data-key wrapping; production installs must use <code>aws-kms</code> (the <code>local-cmk</code> provider is for non-production testing only) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1497" target="_blank" rel="noopener noreferrer" class="">#1497</a>)</li>
<li class=""><strong>MongoDB strict-password gate</strong> — new <code>mongodb.auth.strictPasswords</code> (default off) makes <code>helm install</code>/<code>upgrade</code> fail-fast when <code>auth.rootPassword</code> is left at a known placeholder such as <code>changeme</code></li>
<li class=""><strong>Dependency hardening</strong> — pin <code>aiohttp</code>, <code>websockets</code>, and <code>@aws-sdk/client-kms</code> to exact versions; bump <code>fastmcp</code> to 3.3.1 and regenerate lock files; refresh stale MCP <code>uv.lock</code> files; remove fixable grype findings from container images; bump <code>protobuf</code> and <code>qs</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>There are <strong>no breaking Helm values changes</strong> — every key in the chart diff is additive, and the entire RBAC/OpenFGA/Keycloak/Webex stack ships <strong>disabled by default</strong> (<code>tags.keycloak</code>, <code>tags.webex-bot</code>, <code>openfga.enabled</code>, <code>global.agentgateway.enabled</code>, <code>CAIPE_CREDENTIALS_ENABLED</code> all default to <code>false</code>). For a stock 0.4.18 deployment, <strong>0.5.0 is a drop-in upgrade</strong>.</p>
<p>One <strong>behavioral</strong> breaking change applies only if you were tracking pre-release <code>0.5.x</code> builds or had a custom integration that read the <code>active_team</code> JWT claim:</p>
<ul>
<li class=""><strong><code>active_team</code> JWT claim removed</strong> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1562" target="_blank" rel="noopener noreferrer" class="">#1562</a>) — the single-team-per-token <code>active_team</code> claim and all of its supporting code (heal routes, scope matrices, diagnostic invariants, env passthrough, cleanup script, team-scope Keycloak helpers) have been demolished and replaced with channel-derived team binding. <strong>Consequence if not updated:</strong> any external code that inspected <code>active_team</code> on a CAIPE-issued JWT will no longer find the claim. Authorization is now derived from the channel/space/DM context of the request. No action is required for operators upgrading from <code>0.4.18</code>, since that release never issued the claim through this stack.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0418--050">Upgrade Guide: 0.4.18 → 0.5.0<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#upgrade-guide-0418--050" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.18 → 0.5.0" title="Direct link to Upgrade Guide: 0.4.18 → 0.5.0" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.5.0 introduces the enterprise authorization foundation — OpenFGA ReBAC, Keycloak identity, AgentGateway ext_authz, a Webex bot, and an envelope-encrypted credential store. Despite the size of the release (112 commits), the upgrade is <strong>drop-in for existing 0.4.18 deployments</strong>: every new Helm value is additive with a working default, and all of the new authorization machinery is gated behind feature flags that default to disabled. You only need to edit <code>values.yaml</code> if you are opting into RBAC, the Webex bot, or the credential store.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No keys were renamed, removed, or type-changed between 0.4.18 and 0.5.0. The only modified line is a comment reformat of the unchanged <code>mongodb.auth.rootPassword: "changeme"</code> default. Everything else is <strong>new optional</strong> configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes-1">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<p>None. No breaking Helm values changes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-fields">New Optional Fields<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#new-optional-fields" class="hash-link" aria-label="Direct link to New Optional Fields" title="Direct link to New Optional Fields" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chart-toggles--global-config">Chart toggles &amp; global config<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#chart-toggles--global-config" class="hash-link" aria-label="Direct link to Chart toggles &amp; global config" title="Direct link to Chart toggles &amp; global config" translate="no">​</a></h4>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>tags.webex-bot</code></td><td><code>false</code></td><td>Enable the new Webex bot subchart</td></tr><tr><td><code>tags.keycloak</code></td><td><code>false</code></td><td>Enable the bundled Keycloak identity provider</td></tr><tr><td><code>openfga.enabled</code></td><td><code>false</code></td><td>Enable the OpenFGA relationship PDP</td></tr><tr><td><code>openfgaAuthzBridge.enabled</code></td><td><code>false</code></td><td>Enable the AgentGateway ext_authz bridge</td></tr><tr><td><code>global.image.channel</code></td><td><code>""</code> (auto)</td><td>Force the image repo channel (<code>pre-release</code> or <code>release</code>); empty auto-selects by appVersion</td></tr><tr><td><code>global.agentgateway.enabled</code></td><td><code>false</code></td><td>Route MCP traffic through the AgentGateway proxy</td></tr><tr><td><code>global.agentgateway.installIstioCrds</code></td><td><code>false</code></td><td>Install Istio CRDs (leave false if Istio is already present)</td></tr><tr><td><code>global.agentgateway.proxyPort</code></td><td><code>8080</code></td><td>AgentGateway proxy listener port</td></tr><tr><td><code>global.agentgateway.extAuth.*</code></td><td>disabled</td><td>ext_authz service name/namespace/port for OpenFGA decisions</td></tr><tr><td><code>global.openfga.httpUrl</code></td><td><code>http://{{ .Release.Name }}-openfga:8080</code></td><td>OpenFGA discovery URL for CAIPE components</td></tr><tr><td><code>global.openfga.storeName</code></td><td><code>caipe-openfga</code></td><td>OpenFGA store name</td></tr><tr><td><code>agentgateway.*</code> (top level)</td><td><code>enabled: false</code></td><td>AgentGateway proxy image/config</td></tr><tr><td><code>&lt;agent&gt;.mcp.agentgateway.enabled</code></td><td><code>false</code></td><td>Per-agent: route MCP calls through AgentGateway (with <code>protocol: StreamableHTTP</code>)</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="supervisor-globalconfig">Supervisor (<code>global.config</code>)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#supervisor-globalconfig" class="hash-link" aria-label="Direct link to supervisor-globalconfig" title="Direct link to supervisor-globalconfig" translate="no">​</a></h4>
<table><thead><tr><th>Env Var</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>ENABLE_USER_INFO_TOOL</code></td><td><code>false</code></td><td>Capture user identity from the JWT; enables the <code>user_info</code> tool and JWT context middleware</td></tr><tr><td><code>FORWARD_JWT_TO_MCP</code></td><td><code>false</code></td><td>Forward the user JWT as a Bearer token to HTTP/streamable-HTTP MCP connections (requires <code>ENABLE_USER_INFO_TOOL=true</code>)</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="caipe-ui-caipe-uiconfig--caipe-uikeycloakadminclient">CAIPE UI (<code>caipe-ui.config</code> / <code>caipe-ui.keycloakAdminClient</code>)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#caipe-ui-caipe-uiconfig--caipe-uikeycloakadminclient" class="hash-link" aria-label="Direct link to caipe-ui-caipe-uiconfig--caipe-uikeycloakadminclient" title="Direct link to caipe-ui-caipe-uiconfig--caipe-uikeycloakadminclient" translate="no">​</a></h4>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>keycloakAdminClient.secretName</code></td><td><code>caipe-platform-secret</code></td><td>Secret holding the Keycloak Admin REST client secret</td></tr><tr><td><code>keycloakAdminClient.secretKey</code></td><td><code>OIDC_CLIENT_SECRET</code></td><td>Key within that Secret</td></tr><tr><td><code>keycloakAdminClient.clientId</code></td><td><code>caipe-platform</code></td><td>Keycloak Admin REST client ID</td></tr><tr><td><code>CAIPE_CREDENTIALS_ENABLED</code></td><td><code>false</code></td><td>Enable the Connections &amp; Secrets credential store</td></tr><tr><td><code>CREDENTIAL_STORE_BACKEND</code></td><td><code>mongodb-envelope</code></td><td>Credential storage backend</td></tr><tr><td><code>CREDENTIAL_KEY_PROVIDER</code></td><td><code>local-cmk</code></td><td>Data-key provider (<code>local-cmk</code> for test, <code>aws-kms</code> for prod)</td></tr><tr><td><code>CREDENTIAL_KMS_CMK_ID</code> / <code>CREDENTIAL_KMS_REGION</code></td><td><code>""</code></td><td>AWS KMS CMK id/region when using <code>aws-kms</code></td></tr><tr><td><code>CREDENTIAL_BOOTSTRAP_OAUTH_CONNECTORS</code></td><td><code>false</code></td><td>Bootstrap global OAuth connectors from server env at startup</td></tr><tr><td><code>OPENFGA_HTTP</code></td><td><code>""</code></td><td>OpenFGA URL for relationship authorization (set after OpenFGA is installed)</td></tr><tr><td><code>OPENFGA_STORE_NAME</code></td><td><code>caipe-openfga</code></td><td>OpenFGA store name</td></tr><tr><td><code>OPENFGA_RECONCILE_ENABLED</code></td><td><code>false</code></td><td>Enable OpenFGA reconciliation</td></tr><tr><td><code>KEYCLOAK_URL</code> / <code>KEYCLOAK_REALM</code></td><td><code>""</code> / <code>caipe</code></td><td>Keycloak Admin API integration</td></tr><tr><td><code>KEYCLOAK_RESOURCE_SERVER_ID</code></td><td><code>caipe-platform</code></td><td>Keycloak resource server id for resource/scope sync</td></tr><tr><td><code>SLACK_WORKSPACE_ALIAS</code></td><td><code>CAIPE</code></td><td>Canonical Slack workspace namespace for ReBAC/routes</td></tr><tr><td><code>SLACK_BOT_ADMIN_URL</code> / <code>SLACK_BOT_ADMIN_AUDIENCE</code></td><td>slack-bot URL / <code>caipe-slack-bot-admin</code></td><td>Slack bot internal admin API used by the BFF</td></tr><tr><td><code>WEBEX_BOT_ADMIN_URL</code> / <code>WEBEX_BOT_ADMIN_AUDIENCE</code></td><td>webex-bot URL / <code>caipe-webex-bot-admin</code></td><td>Webex bot internal admin API</td></tr><tr><td><code>WEBEX_THREAD_CONTEXT_*</code></td><td><code>true</code> / <code>10</code> / <code>4000</code></td><td>Webex thread-context window settings</td></tr><tr><td><code>CAIPE_ORG_KEY</code> / <code>CAIPE_ORG_DISPLAY_NAME</code></td><td><code>caipe</code> / <code>CAIPE</code></td><td>Org namespace + display name</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents-dynamic-agentsconfig">Dynamic Agents (<code>dynamic-agents.config</code>)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#dynamic-agents-dynamic-agentsconfig" class="hash-link" aria-label="Direct link to dynamic-agents-dynamic-agentsconfig" title="Direct link to dynamic-agents-dynamic-agentsconfig" translate="no">​</a></h4>
<table><thead><tr><th>Env Var</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>KEYCLOAK_URL</code></td><td><code>http://ai-platform-engineering-keycloak:8080</code></td><td>In-cluster Keycloak service URL for JWKS fetch (override for external IdP)</td></tr><tr><td><code>OIDC_ISSUER</code></td><td><code>""</code></td><td>Browser-facing issuer baked into JWTs; falls back to deriving from <code>KEYCLOAK_URL</code> in dev</td></tr><tr><td><code>CAIPE_CREDENTIALS_ENABLED</code></td><td><code>false</code></td><td>Enable the credential-exchange client</td></tr><tr><td><code>CREDENTIAL_API_URL</code></td><td>caipe-ui <code>/api/credentials</code></td><td>Credential exchange API endpoint</td></tr><tr><td><code>USE_IMPERSONATION_TOKENS</code></td><td><code>false</code></td><td>Use impersonation tokens for downstream calls</td></tr><tr><td><code>AGENT_GATEWAY_MCP_SERVER_IDS</code></td><td><code>jira</code></td><td>MCP server IDs routed through the AgentGateway backend</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="slack-bot-slack-botconfig">Slack bot (<code>slack-bot.config</code>)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#slack-bot-slack-botconfig" class="hash-link" aria-label="Direct link to slack-bot-slack-botconfig" title="Direct link to slack-bot-slack-botconfig" translate="no">​</a></h4>
<table><thead><tr><th>Env Var</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>SLACK_WORKSPACE_ALIAS</code></td><td><code>CAIPE</code></td><td>Canonical workspace namespace for ReBAC/routes</td></tr><tr><td><code>SLACK_AGENT_ROUTES_MODE</code></td><td><code>db_prefer</code></td><td>Prefer UI-managed Slack routes, fall back to static config</td></tr><tr><td><code>SLACK_AUTO_ASSIGN_UNMAPPED_CHANNELS</code></td><td><code>false</code></td><td>Opt-in first-message channel onboarding</td></tr><tr><td><code>SLACK_DEFAULT_TEAM_SLUG</code> / <code>SLACK_DEFAULT_AGENT_ID</code></td><td><code>""</code></td><td>Required when auto-assignment is enabled</td></tr><tr><td><code>SLACK_ADMIN_API_ENABLED</code></td><td><code>false</code></td><td>Internal admin API for route status/reload/config sync</td></tr><tr><td><code>SLACK_ADMIN_JWT_ISSUER</code> / <code>SLACK_ADMIN_JWT_AUDIENCE</code></td><td><code>""</code> / <code>caipe-slack-bot-admin</code></td><td>OIDC issuer/audience for the admin API</td></tr><tr><td><code>SLACK_ADMIN_ALLOWED_CLIENT_IDS</code></td><td><code>caipe-ui</code></td><td>Client IDs allowed to call the admin API</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-subcharts-entirely-new-value-blocks">New subcharts (entirely new value blocks)<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#new-subcharts-entirely-new-value-blocks" class="hash-link" aria-label="Direct link to New subcharts (entirely new value blocks)" title="Direct link to New subcharts (entirely new value blocks)" translate="no">​</a></h4>
<table><thead><tr><th>Block</th><th>Enabled by</th><th>Purpose</th></tr></thead><tbody><tr><td><code>webex-bot</code></td><td><code>tags.webex-bot=true</code></td><td>Webex spaces, identity linking, OpenFGA ReBAC</td></tr><tr><td><code>keycloak</code></td><td><code>tags.keycloak=true</code></td><td>Identity provider, federation broker, RFC 8693 token exchange</td></tr><tr><td><code>openfga</code></td><td><code>openfga.enabled=true</code></td><td>Relationship PDP (team/resource tuples)</td></tr><tr><td><code>openfga-authz-bridge</code></td><td><code>openfgaAuthzBridge.enabled=true</code></td><td>Envoy ext_authz → OpenFGA Check bridge for AgentGateway</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deprecated--removed-keys">Deprecated / Removed Keys<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#deprecated--removed-keys" class="hash-link" aria-label="Direct link to Deprecated / Removed Keys" title="Direct link to Deprecated / Removed Keys" translate="no">​</a></h3>
<p>None. No keys were deprecated or removed in 0.5.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<ul>
<li class=""><strong>MongoDB</strong>: no destructive schema migration. New collections back the credential store (envelope-encrypted) and Slack/Webex route management; the credential store also adds indexes via <code>scripts/init-credential-mongo-indexes.ts</code>. These are created lazily/on-demand and only when the corresponding feature is enabled.</li>
<li class=""><strong>OpenFGA</strong>: if you enable RBAC, the OpenFGA chart bootstraps the authorization model (<code>authorization-model.json</code>) and creates the <code>caipe-openfga</code> store. Existing deployments have nothing to migrate — there was no prior OpenFGA store.</li>
<li class=""><strong>Keycloak</strong>: the Keycloak subchart is new in this release. Enabling it initializes the <code>caipe</code> realm, token-exchange clients, and (optionally) the upstream IdP broker. No migration from a prior CAIPE-managed Keycloak is required for 0.4.18 upgraders.</li>
<li class=""><strong><code>active_team</code> JWT claim</strong>: no data migration — the claim is simply no longer issued, and authorization is derived from channel context at request time.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<p>This alone is sufficient for a stock upgrade — the new authorization stack stays disabled.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-apply-valuesyaml-changes">2. Apply values.yaml changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#2-apply-valuesyaml-changes" class="hash-link" aria-label="Direct link to 2. Apply values.yaml changes" title="Direct link to 2. Apply values.yaml changes" translate="no">​</a></h3>
<p>No breaking changes require edits. If you want to <strong>opt into RBAC</strong>, enable the foundation subcharts and point CAIPE UI at them:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">keycloak</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">openfga</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">caipe-ui</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">OPENFGA_HTTP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://ai-platform-engineering-openfga:8080"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">OPENFGA_RECONCILE_ENABLED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">KEYCLOAK_URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://ai-platform-engineering-keycloak:8080"</span><br></span></code></pre></div></div>
<p>To opt into the <strong>Webex bot</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">webex-bot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><br></span></code></pre></div></div>
<p>To opt into the <strong>credential store</strong> (use <code>aws-kms</code> in production):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">caipe-ui</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">CAIPE_CREDENTIALS_ENABLED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">CREDENTIAL_KEY_PROVIDER</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"aws-kms"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">CREDENTIAL_KMS_CMK_ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;your-cmk-id&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">CREDENTIAL_KMS_REGION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;your-region&gt;"</span><br></span></code></pre></div></div>
<p>For production secrets hygiene, consider turning on the new strict-mode gates once you have wired real secrets:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">mongodb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">strictPasswords</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain">   </span><span class="token comment" style="color:rgb(98, 114, 164)"># fail-fast on placeholder rootPassword</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># If you enabled RBAC, confirm the auth foundation pods are healthy</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-E</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'keycloak|openfga'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># If you enabled the Webex bot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get deploy </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> webex-bot</span><br></span></code></pre></div></div>
<p>For a stock upgrade, confirm all existing pods roll cleanly — no new admission constraints are introduced.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.5.0#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.4.18 → 0.5.0)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">--- /tmp/vf-0.5.0.yaml	2026-05-29 09:11:41</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">+++ /tmp/vt-0.5.0.yaml	2026-05-29 09:11:42</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">@@ -22,6 +22,8 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  agent-petstore: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  rag-stack: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  slack-bot: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  webex-bot: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  keycloak: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># Global configuration shared across all subcharts</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">global:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -30,6 +32,11 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # Individual subchart `image.tag` values still take highest precedence.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    tag: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # -- Image repository channel for maintained CAIPE images.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Empty means auto: rc/hotfix/dev chart appVersions use `pre-release/`,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # final release appVersions use the root published image repositories.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Set to `pre-release` or `release` to force either repository channel.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    channel: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # Deployment mode: "single-node" (all agents in-process) or "multi-node" (each agent as a separate pod)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  deploymentMode: "multi-node"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -115,7 +122,30 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Set to true only if Istio CRDs are NOT already present in the cluster.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # If Istio is already installed (any version), leave this false to avoid conflicts.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    installIstioCrds: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Port for the agentgateway proxy listener (Gateway resource)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    proxyPort: 8080</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    extAuth:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      serviceName: "ai-platform-engineering-openfga-authz-bridge"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      serviceNamespace: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      port: 9100</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # OpenFGA service discovery defaults for CAIPE components that perform</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # relationship-based authorization or reconciliation.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  openfga:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    httpUrl: "http://{{ .Release.Name }}-openfga:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    storeName: "caipe-openfga"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    repository: cr.agentgateway.dev/agentgateway</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tag: v1.1.0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    pullPolicy: IfNotPresent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # LangGraph Redis for checkpoint and cross-thread store persistence.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # Two deployment options:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  #   1. Dedicated Redis Stack (recommended): set enabled=true to deploy langgraph-redis subchart</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -276,6 +306,8 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    USE_STRUCTURED_RESPONSE: "true" # Set to "true" to enforce agent to always use structured response format as the final output</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    TASK_CONFIG_PATH: "/app/task_config.yaml"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    POLICY_FILE_PATH: "/app/policy.lp"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    ENABLE_USER_INFO_TOOL: "false"   # Capture user identity from JWT; enables user_info tool and JWT context middleware</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    FORWARD_JWT_TO_MCP: "false"      # Forward the user JWT as Bearer token to HTTP/streamable-HTTP MCP connections (requires ENABLE_USER_INFO_TOOL=true). Also used by sub-agents via base_langgraph_agent.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Self-service workflow env vars — referenced as ${VAR_NAME} in task_config.yaml prompts.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Set these per environment so system workflows can resolve repo references at runtime.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # JARVIS_WORKFLOWS_REPO: "org/jarvis-workflows"      # Templates repo (safe-settings, terraform, etc.)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -377,6 +409,12 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Route MCP traffic through agentgateway proxy (requires global.agentgateway.enabled).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # When enabled, subagent MCP calls go through the agentgateway proxy which can</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # enforce JWT validation and ext_authz decisions backed by OpenFGA.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP # SSE or StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-backstage:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-backstage"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -391,6 +429,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-confluence:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-confluence"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -404,6 +445,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    env:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      TRANSPORT: "streamable-http"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -478,6 +522,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-pagerduty:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-pagerduty"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -492,6 +539,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-slack:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-slack"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -505,6 +555,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 3001</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    command: ["--transport", "http"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    env:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      SLACK_MCP_HOST: "0.0.0.0"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -526,6 +579,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  env:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # -- Block kubectl get/describe secret(s) and redact Secret data from output. Defaults to true (on).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    RESTRICT_KUBECTL_SECRETS: "true"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -553,6 +609,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-victorops:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-victorops"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -566,6 +625,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-webex:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-webex"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -580,6 +642,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-weather:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-weather"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -608,6 +673,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-netutils:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-netutils"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -624,6 +692,9 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    mode: "http" # Options: stdio, http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    agentgateway:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      protocol: StreamableHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">agent-weather:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "agent-weather"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -650,6 +721,25 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  skills:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  nameOverride: "caipe-ui"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # R1 upstream fix (May 2026): default the Keycloak Admin REST client</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # secret name to "caipe-platform-secret" — the conventional name an</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # operator passes via `keycloak.platformClient.secretRef` AND the</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # default target of the keycloak chart's ExternalSecret (see below</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # where we also default `keycloak.platformClient.secretRef` itself).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Helm does not support cross-subchart value substitution at template</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # time, so we have to hardcode the conventional name in both places.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Operators using a non-default Secret name must override BOTH:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     keycloak.platformClient.secretRef: my-custom-platform-secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     caipe-ui.keycloakAdminClient.secretName: my-custom-platform-secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # See docs/docs/security/rbac/secrets-bootstrap.md section "R1: BFF</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Keycloak Admin token — production-safety gate".</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # assisted-by Claude:claude-opus-4-7</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  keycloakAdminClient:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretName: "caipe-platform-secret"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretKey: "OIDC_CLIENT_SECRET"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    clientId: "caipe-platform"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    repository: "ghcr.io/cnoe-io/caipe-ui"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # tag defaults to .Chart.AppVersion when not specified</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -719,6 +809,18 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    DYNAMIC_AGENTS_ENABLED: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Dynamic Agents service URL (only used when DYNAMIC_AGENTS_ENABLED is "true")</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # DYNAMIC_AGENTS_URL: "http://ai-platform-engineering-dynamic-agents:8001"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Connections &amp; Secrets credential store. Disabled by default. Use local-cmk</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # only for non-production testing; production must use aws-kms.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_CREDENTIALS_ENABLED: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_STORE_BACKEND: "mongodb-envelope"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_KEY_PROVIDER: "local-cmk"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_KMS_CMK_ID: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_KMS_REGION: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_SERVICE_AUDIENCE: "caipe-credential-service"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Bootstrap global OAuth connectors from server env at startup. In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Kubernetes, provide provider client IDs/secrets/redirect URIs through</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # externalSecrets; in Docker Compose, provide them through .env.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_BOOTSTRAP_OAUTH_CONNECTORS: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Standalone skill-scanner microservice (cisco-ai-defense/skill-scanner).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Active when global.skillScanner.enabled=true; the in-cluster Service</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # name is derived from the Helm release name, so the URL is rendered</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -729,6 +831,15 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    SKILL_SCANNER_URL: "http://{{ .Release.Name }}-skill-scanner:8000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # MongoDB configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    MONGODB_DATABASE: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # OpenFGA relationship authorization. Enable reconciliation only after</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # OpenFGA is installed and the authorization model has been initialized.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_HTTP: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_STORE_NAME: "caipe-openfga"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_RECONCILE_ENABLED: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Keycloak Admin API integration for resource/scope synchronization.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_REALM: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_RESOURCE_SERVER_ID: "caipe-platform"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # NextAuth URL (non-sensitive)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    NEXTAUTH_URL: "http://localhost:3000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Node environment</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -737,6 +848,29 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    TAGLINE: "Multi-Agent Workflow Automation"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    DESCRIPTION: "Where Humans and AI agents collaborate to deliver high quality outcomes."</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    APP_NAME: "CAIPE"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Canonical Slack workspace namespace used by UI-managed Slack ReBAC/routes.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_WORKSPACE_ALIAS: "CAIPE"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Slack bot internal admin API used by the Web UI BFF for route reload and</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # one-time static-config-to-MongoDB/OpenFGA migration. The BFF uses the</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # existing OIDC_CLIENT_ID/OIDC_CLIENT_SECRET Keycloak client credentials.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_BOT_ADMIN_URL: "http://ai-platform-engineering-slack-bot:3001"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_BOT_ADMIN_AUDIENCE: "caipe-slack-bot-admin"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # SLACK_BOT_ADMIN_TOKEN_URL: "http://keycloak:7080/realms/caipe/protocol/openid-connect/token"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # SLACK_BOT_ADMIN_SCOPE: "slack:routes:read slack:routes:reload slack:routes:sync"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_DEFAULT_TEAM_SLUG: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_DEFAULT_AGENT_ID: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Webex bot internal admin API (BFF access-check + route management).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_BOT_ADMIN_URL: "http://ai-platform-engineering-webex-bot:3002"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_BOT_ADMIN_CLIENT_ID: "caipe-ui"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_BOT_ADMIN_AUDIENCE: "caipe-webex-bot-admin"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # WEBEX_BOT_ADMIN_TOKEN_URL: "http://keycloak:7080/realms/caipe/protocol/openid-connect/token"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_DEFAULT_TEAM_SLUG: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_DEFAULT_AGENT_ID: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_THREAD_CONTEXT_ENABLED: "true"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_THREAD_CONTEXT_MAX_MESSAGES: "10"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_THREAD_CONTEXT_MAX_CHARS: "4000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_ORG_KEY: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_ORG_DISPLAY_NAME: "CAIPE"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    LOGO_URL: "/logo.svg"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    LOGO_STYLE: "default"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # SPINNER_COLOR: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -779,8 +913,18 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      size: 10Gi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    auth:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      rootUsername: "admin"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">      rootPassword: "changeme"  # CHANGE THIS or use external secrets</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # CHANGE THIS or use external secrets.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # R3 (May 2026): set `mongodb.strictPasswords: true` below to make</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # `helm install` / `helm upgrade` fail-fast on the placeholder.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      rootPassword: "changeme"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      database: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # R3: Production-safety gate. When true AND `externalSecrets.enabled`</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # is false, the chart refuses to render if `auth.rootPassword` is a</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # known placeholder ("changeme", "admin", "password", "mongo",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # "root", "test", etc.). Mirrors `keycloak.strictClientSecrets`.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Default false so docker-compose dev + CI matrix keep working.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # assisted-by Claude:claude-opus-4-7</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    strictPasswords: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # External Secrets for MongoDB credentials</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    externalSecrets:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      enabled: false  # Set to true to use external secrets</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -887,8 +1031,31 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    port: 8001</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # ConfigMap for non-sensitive configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  config:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # ─── Keycloak / OIDC (REQUIRED for Bearer token validation) ─────────</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # In-cluster Keycloak service URL used for the server-to-server JWKS</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # fetch. The bundled Keycloak subchart exposes its service as</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # `&lt;release&gt;-keycloak`; this default works for the umbrella chart</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # but MUST be overridden when pointing dynamic-agents at an external</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Keycloak (production IdP / forge.dev / etc.).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_URL: "http://ai-platform-engineering-keycloak:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Browser-facing issuer string baked into JWTs (Keycloak's</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # KC_HOSTNAME). Override when the public issuer differs from</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # KEYCLOAK_URL (the typical production topology), e.g.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # OIDC_ISSUER: "https://idp.example.com/realms/caipe".</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Leaving this empty falls back to deriving the issuer from</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # KEYCLOAK_URL, which only works in dev where both URLs coincide;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # NOTES.txt prints a warning otherwise.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OIDC_ISSUER: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # MongoDB configuration (uses same database as CAIPE UI)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    MONGODB_DATABASE: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Connections &amp; Secrets credential exchange client. Disabled by default.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_CREDENTIALS_ENABLED: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_API_URL: "http://ai-platform-engineering-caipe-ui:3000/api/credentials"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CREDENTIAL_SERVICE_AUDIENCE: "caipe-credential-service"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    USE_IMPERSONATION_TOKENS: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # MCP server IDs routed through the shared AgentGateway backend.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Other MCP servers keep direct endpoints so tool names reflect real upstreams.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    AGENT_GATEWAY_MCP_SERVER_IDS: "jira"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # LLM configuration (override if needed)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # LLM_PROVIDER: "openai"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # LLM_MODEL: "gpt-4o"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -930,9 +1097,20 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    SLACK_INTEGRATION_SILENCE_ENV: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # MONGODB_URI: ""                          # Override per environment</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # SLACK_WORKSPACE_URL: ""                  # e.g. "https://mycompany.slack.com"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_WORKSPACE_ALIAS: "CAIPE"             # Canonical workspace namespace for Slack ReBAC/routes</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # SLACK_INTEGRATION_ENABLE_AUTH: "true"    # Enable OAuth2 Client Credentials</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # OAUTH2_TOKEN_URL: ""                     # OIDC token endpoint</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # OAUTH2_CLIENT_ID: ""                     # OAuth2 client ID</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_AGENT_ROUTES_MODE: "db_prefer"       # Prefer UI-managed Slack routes, fallback to static config</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_AUTO_ASSIGN_UNMAPPED_CHANNELS: "false" # Opt-in first-message channel onboarding</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_DEFAULT_TEAM_SLUG: ""                # Required when auto-assignment is enabled</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_DEFAULT_AGENT_ID: ""                 # Required when auto-assignment is enabled</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_ADMIN_API_ENABLED: "false"           # Internal admin API for route status/reload/config sync</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_ADMIN_API_HOST: "0.0.0.0"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_ADMIN_API_PORT: "3001"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_ADMIN_JWT_ISSUER: ""                 # Set to Keycloak/OIDC issuer when admin API is enabled</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_ADMIN_JWT_AUDIENCE: "caipe-slack-bot-admin"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SLACK_ADMIN_ALLOWED_CLIENT_IDS: "caipe-ui"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # -- Reference to a pre-existing Kubernetes Secret.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  # Should contain: SLACK_BOT_TOKEN, SLACK_APP_TOKEN, SLACK_SIGNING_SECRET,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -963,10 +1141,41 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      name: "vault"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      kind: "ClusterSecretStore"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    data: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # Example placeholders. Keep values in your external secret backend; these</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # keys are materialized into the generated Kubernetes Secret and injected</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # into the slack-bot pod via envFrom.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      # - secretKey: SLACK_BOT_TOKEN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      #     property: bot_token</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: SLACK_APP_TOKEN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: app_token</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: SLACK_SIGNING_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: signing_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: SLACK_CLIENT_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: slack_client_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: SLACK_LINK_HMAC_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: slack_link_hmac_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: OAUTH2_CLIENT_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: oauth2_client_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: KEYCLOAK_BOT_CLIENT_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: keycloak_bot_client_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: KEYCLOAK_SLACK_BOT_ADMIN_CLIENT_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/slack-bot</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: keycloak_slack_bot_admin_client_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  resources:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    requests:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token coord">@@ -976,6 +1185,215 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      cpu: 500m</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      memory: 512Mi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">######### Webex Bot Integration configuration #########</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Parallel to slack-bot: Webex spaces, identity linking, and OpenFGA ReBAC.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Enable with Helm tag: webex-bot=true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">webex-bot:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    repository: "ghcr.io/cnoe-io/caipe-webex-bot"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tag: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  config:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    APP_NAME: "CAIPE"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    CAIPE_API_URL: "http://ai-platform-engineering-caipe-ui:3000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_WORKSPACE_ALIAS: "CAIPE-WEBEX"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_AGENT_ROUTES_MODE: "db_prefer"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_THREAD_CONTEXT_ENABLED: "true"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_THREAD_CONTEXT_MAX_MESSAGES: "10"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_THREAD_CONTEXT_MAX_CHARS: "4000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_AUTO_ASSIGN_UNMAPPED_SPACES: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_DEFAULT_TEAM_SLUG: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_DEFAULT_AGENT_ID: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_API_ENABLED: "false"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_API_HOST: "0.0.0.0"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_API_PORT: "3002"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_JWT_ISSUER: "http://ai-platform-engineering-keycloak:8080/realms/caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_JWKS_URL: "http://ai-platform-engineering-keycloak:8080/realms/caipe/protocol/openid-connect/certs"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_JWT_AUDIENCE: "caipe-webex-bot-admin"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    WEBEX_ADMIN_ALLOWED_CLIENT_IDS: "caipe-ui"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_URL: "http://ai-platform-engineering-keycloak:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    KEYCLOAK_REALM: "caipe"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_HTTP: "http://ai-platform-engineering-openfga:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    OPENFGA_STORE_NAME: "caipe-openfga"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Wire OBO secret from Keycloak chart (see keycloak/templates/NOTES.txt).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  keycloakBot:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    clientSecretFromSecret:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: "ai-platform-engineering-keycloak-webex-bot"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      key: "KC_WEBEX_BOT_CLIENT_SECRET"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  existingSecret: "webex-bot-secrets"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  botConfig: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  externalSecrets:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    apiVersion: "v1beta1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretStoreRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: "vault"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      kind: "ClusterSecretStore"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    data: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  resources:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    requests:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      cpu: 100m</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      memory: 256Mi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    limits:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      cpu: 500m</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      memory: 512Mi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">######### Keycloak Identity Provider configuration #########</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Keycloak provides RBAC, identity federation (upstream SSO broker),</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># and token exchange (RFC 8693) for the Slack bot.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Enable with tag: keycloak=true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">keycloak:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    repository: "quay.io/keycloak/keycloak"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tag: "26.3"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    pullPolicy: IfNotPresent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Admin credentials — auto-generated random password by default.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # For prod: set admin.secretRef to an existing Secret, or enable</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # externalSecrets to pull from Vault / AWS Secrets Manager.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  admin:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    username: admin</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    password: ""       # Leave empty for auto-generated 32-char password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretRef: ""      # Set to an existing K8s Secret name with keys: username, password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  realm:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    name: caipe</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    sslRequired: "external"  # "none" for dev, "external" for prod</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Keycloak features</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  features:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tokenExchange: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    adminFineGrainedAuthz: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Token exchange setup — enables bot impersonation via RFC 8693</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  tokenExchange:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    botClientId: "caipe-slack-bot"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  webexTokenExchange:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    botClientId: "caipe-webex-bot"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # CAIPE platform OIDC client (the supervisor confidential client).</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # R1 upstream fix (May 2026): the umbrella defaults `secretRef` to</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # `caipe-platform-secret` so the keycloak chart's</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # `platformClientSecretName` helper and the caipe-ui Deployment's</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # `KEYCLOAK_ADMIN_CLIENT_SECRET` valueFrom.secretKeyRef both resolve</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # to the same Secret name. An operator who:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #   - pre-creates a K8s Secret called `caipe-platform-secret` with</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     key `OIDC_CLIENT_SECRET`, OR</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #   - enables `externalSecret.enabled=true` (ESO emits a Secret of</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #     this same name as its target),</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # gets the full BFF → Keycloak Admin REST wiring out of the box.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  #</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Migration for existing ESO installs that used the OLD default name</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # `&lt;release&gt;-keycloak-platform-client`: see</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # docs/docs/security/rbac/secrets-bootstrap.md → R1 upstream fix.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # assisted-by Claude:claude-opus-4-7</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  platformClient:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretRef: "caipe-platform-secret"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Upstream IDP broker (generic OIDC — works with Okta, Azure AD, Duo, etc.)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # No vendor-specific credentials stored here.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  idp:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    alias: ""              # e.g. "upstream-sso"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    displayName: ""        # e.g. "Enterprise SSO"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    issuer: ""             # OIDC issuer URL</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    clientId: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretRef: ""          # K8s Secret with key: IDP_CLIENT_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    accessGroup: ""        # Optional upstream group reference; mirrored into idp_groups only</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    adminGroup: ""         # Optional upstream admin group reference; map to OpenFGA admin via Identity Group Sync</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # External Secrets for admin password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  externalSecrets:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    apiVersion: "v1beta1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretStoreRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: "vault"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      kind: "ClusterSecretStore"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    data: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: prod/keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: admin_password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  service:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    type: ClusterIP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    port: 8080</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  resources:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    requests:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      cpu: 250m</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      memory: 512Mi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    limits:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      cpu: "1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      memory: 1Gi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">######### OpenFGA Relationship PDP configuration #########</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># OpenFGA stores team/resource tuples used by the UI and the AgentGateway</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># ext_authz bridge. Enable for RBAC/ReBAC installs.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">openfga:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    repository: openfga/openfga</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tag: v1.15.1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    pullPolicy: IfNotPresent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  init:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    storeName: caipe-openfga</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    seedTuples: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  datastore:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    engine: memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    uriSecretRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      key: OPENFGA_DATASTORE_URI</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  migrate:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">######### OpenFGA AgentGateway ext_authz bridge #########</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># The bridge receives Envoy ext_authz checks from AgentGateway and performs</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># OpenFGA Check calls. Enable alongside OpenFGA and AgentGateway.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">openfgaAuthzBridge:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Values for the openfga-authz-bridge subchart. The separate camelCase block</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># above is kept as the dependency condition flag.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">openfga-authz-bridge:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    repository: ghcr.io/cnoe-io/openfga-authz-bridge</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tag: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    pullPolicy: IfNotPresent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  openfga:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    httpUrl: "http://{{ .Release.Name }}-openfga:8080"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    storeName: caipe-openfga</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    relation: can_call</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    object: mcp_gateway:list</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  agentContext:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    existingSecret:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      key: CAIPE_AGENT_CONTEXT_HMAC_SECRET</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  tokenValidation:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    jwksUrl: "http://{{ .Release.Name }}-keycloak:8080/realms/caipe/protocol/openid-connect/certs"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    issuer: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    audiences: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    algorithms:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      - RS256</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  audit:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    mongodbUri: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    mongodbDatabase: caipe</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tenantId: default</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    subjectSalt: caipe-098-audit</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    existingSecret:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      key: MONGODB_URI</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">######### RAG Stack configuration #########</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># RAG Stack - Complete stack including web, server, agent, Redis, and Milvus</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># Below values are only a subset of the values that are available in the rag-stack chart.</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.17 — Scrapy 2.16 Crawl Fix]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17"/>
        <updated>2026-05-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-22]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-22
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.17</code>
Previous release: 0.4.16</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.17 is a targeted fix for RAG web ingestion. Scrapy 2.16.0 added validation that raised <code>AttributeError</code> whenever a spider defined a singular <code>start_url</code> attribute without a populated <code>start_urls</code>, which broke every crawl mode — single, recursive, and sitemap — resulting in zero pages crawled for any web ingestion request. This release renames the conflicting attribute, adds the new async spider entrypoint, and pins a stable Twisted to resolve a Scrapy 2.16 TLS bug.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<p>No new features in this release — it is a focused bug-fix release for RAG web crawling.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>rag</strong>: restore web crawling under Scrapy 2.16 — renamed the custom <code>self.start_url</code> attribute to <code>self.origin_url</code> across all five affected spiders (<code>scrapy_worker.py</code>, <code>spiders/base.py</code>, <code>spiders/recursive.py</code>, <code>spiders/single_url.py</code>, <code>spiders/sitemap.py</code>) to avoid Scrapy 2.16's new <code>start_url</code>/<code>start_urls</code> validation, added an async <code>start()</code> entrypoint for the new Scrapy API, and pinned <code>twisted==26.4.0</code> to fix a Scrapy 2.16 TLS bug (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1489" target="_blank" rel="noopener noreferrer" class="">#1489</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.16.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.17 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0416--0417">Upgrade Guide: 0.4.16 → 0.4.17<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#upgrade-guide-0416--0417" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.16 → 0.4.17" title="Direct link to Upgrade Guide: 0.4.16 → 0.4.17" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Drop-in upgrade — no <code>values.yaml</code> edits required. 0.4.17 fixes a critical regression in RAG web ingestion caused by the Scrapy 2.16 upgrade. If you use the RAG stack for web crawling (single URL, recursive, or sitemap modes), this upgrade is strongly recommended — earlier builds returned zero crawled pages.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.16 and 0.4.17. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.17 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.17#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>If you run the RAG stack, confirm a web ingestion crawl now returns pages:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> rag</span><br></span></code></pre></div></div>
<p>Trigger a single-URL crawl and confirm pages are ingested rather than failing immediately at crawl start.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.18 — Dynamic Agent Chat Regression Fix]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18"/>
        <updated>2026-05-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-22]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-22
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.18</code>
Previous release: 0.4.17</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.18 fixes a regression introduced in 0.4.17 where dynamic agent configs stored with <code>null</code> fields in MongoDB raised a pydantic <code>ValidationError</code> on every chat request, effectively breaking chat for affected deployments. A new <code>_strip_nulls()</code> helper now removes explicit <code>null</code> values before pydantic construction so <code>default_factory</code> defaults apply correctly. This release also fixes Jira internal-comment creation, which was failing with a JSM 404 authentication error.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<p>No new features in this release — it is a focused bug-fix release addressing a chat regression and a Jira tooling failure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>dynamic-agents</strong>: strip <code>null</code> values from MongoDB documents before pydantic construction — passing explicit <code>None</code> for fields stored as <code>null</code> bypassed pydantic <code>default_factory</code> and raised a <code>ValidationError</code> on every chat request in 0.4.17; the new <code>_strip_nulls()</code> helper is now applied at all three construction sites (<code>get_agent</code>, <code>get_server</code>, <code>get_servers_by_ids</code>), and the <code>interrupt_on</code> seed default is reverted back to <code>undefined</code> for consistency with other fields (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1503" target="_blank" rel="noopener noreferrer" class="">#1503</a>)</li>
<li class=""><strong>jira</strong>: create internal comments via the Jira platform comment API with the <code>sd.public.comment</code> property set to <code>internal: true</code> — the previous JSM customer-request endpoint returned <code>HTTP 404 sd.customerview.error.vpOriginMissing</code> when the API user could not resolve the issue as an accessible portal request (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1490" target="_blank" rel="noopener noreferrer" class="">#1490</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.17.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.18 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0417--0418">Upgrade Guide: 0.4.17 → 0.4.18<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#upgrade-guide-0417--0418" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.17 → 0.4.18" title="Direct link to Upgrade Guide: 0.4.17 → 0.4.18" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Drop-in upgrade — no <code>values.yaml</code> edits required. 0.4.18 is a fix-forward release for the dynamic-agents chat regression in 0.4.17. <strong>If you are running 0.4.17 with dynamic agents, upgrade promptly</strong> — chat requests fail with a pydantic <code>ValidationError</code> for any agent whose config stores <code>null</code> fields in MongoDB. This release also restores Jira internal-comment creation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.17 and 0.4.18. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required. Existing documents with <code>null</code> fields are handled at read time by the new <code>_strip_nulls()</code> helper — no document rewrite is necessary.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.18 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.18#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>Confirm a chat request against a dynamic agent succeeds instead of returning a <code>ValidationError</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> dynamic-agents</span><br></span></code></pre></div></div>
<p>Send a test message to a dynamic agent and confirm a normal response is returned.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.16 — RAG Truncation and Seed Persistence Fixes]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16"/>
        <updated>2026-05-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-21]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-21
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.16</code>
Previous release: 0.4.15</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.16 is a maintenance release focused on correctness. The <code>RAG_MAX_OUTPUT_CHARS</code> cap now actually fires for MCP tool results (previously a type check silently skipped truncation), seed agent configs once again persist their <code>ui</code>, <code>features</code>, and <code>interrupt_on</code> fields to MongoDB, and two reopened CodeQL code-scanning alerts are closed. The bundled CAIPE API reference docs were also refreshed to match the current BFF and RAG surfaces.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation">Documentation<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h3>
<ul>
<li class=""><strong>Refreshed CAIPE API reference</strong> — replaced the stale <code>/api/usecases</code> and UI OpenAPI examples with a current BFF reference (auth, chat/runtime proxies, dynamic agent config, MCP server config, workflows, skills/catalog, RAG proxy, settings/users, admin routes) plus a dedicated Knowledge Bases RAG API reference (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1484" target="_blank" rel="noopener noreferrer" class="">#1484</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>rag</strong>: <code>_truncate_output</code> now serializes non-<code>str</code> results with <code>json.dumps</code> before applying the length cap — MCP tools return <code>list[dict]</code> content blocks, so the previous <code>isinstance(result, str)</code> guard was always <code>False</code> and <code>RAG_MAX_OUTPUT_CHARS</code> truncation never fired (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1488" target="_blank" rel="noopener noreferrer" class="">#1488</a>)</li>
<li class=""><strong>ui</strong>: persist <code>ui</code>, <code>features</code>, and <code>interrupt_on</code> fields in <code>seedAgents</code> — agent gradient themes, middleware config, and human-approval (interrupt) settings were silently dropped when upserting seed agents to MongoDB; the same change also refines the escalation-handoff and clear-role-definition micro-prompts and removes the no-second-person-preamble AI review rule (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1486" target="_blank" rel="noopener noreferrer" class="">#1486</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>code scanning</strong>: closed two CodeQL alerts that reopened on <code>main</code> — removed a clear-text logging path derived from <code>client_secret</code> state in <code>get_token.py</code>, stopped copying raw exception text into the skill scanner result dict in <code>skill_scanner_runner.py</code>, and restored the filesystem Grype SARIF category from <code>grype-filesystem</code> back to the historical <code>grype</code> category so older alerts are correctly superseded (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1478" target="_blank" rel="noopener noreferrer" class="">#1478</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.15.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.16 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0415--0416">Upgrade Guide: 0.4.15 → 0.4.16<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#upgrade-guide-0415--0416" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.15 → 0.4.16" title="Direct link to Upgrade Guide: 0.4.15 → 0.4.16" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Drop-in upgrade — no <code>values.yaml</code> edits required. 0.4.16 ships only application bug fixes (RAG output truncation, seed-agent field persistence) and a security fix for code-scanning alerts. There are no chart, schema, or configuration changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.15 and 0.4.16. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.16 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.16#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>All pods should roll over with new image tags and return to <code>Running</code>. No further action is required.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.14 — Slack and Chat Reliability]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14"/>
        <updated>2026-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-20]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-20
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.14</code>
Previous release: 0.4.13</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.14 is a maintenance release focused on Slack and chat reliability. It fixes several cases where the Slack bot silently failed to respond — overthink skip logic that never fired on auto-routed channel messages, and alert integrations that put all their content inside attachment blocks. The <code>/invoke</code> chat endpoint gains optional conversation-history persistence, the skill scanner now returns actionable validation errors for malformed skills, and Jira agents can post internal (non-customer-visible) service desk comments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="jira">Jira<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#jira" class="hash-link" aria-label="Direct link to Jira" title="Direct link to Jira" translate="no">​</a></h3>
<ul>
<li class=""><strong>Internal service desk comments</strong> — a dedicated Jira MCP tool posts Jira Service Management internal notes via the request comment API with <code>public: false</code>, so agents can leave internal-only notes without customer-visible comments (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1445" target="_blank" rel="noopener noreferrer" class="">#1445</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="chat-api">Chat API<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#chat-api" class="hash-link" aria-label="Direct link to Chat API" title="Direct link to Chat API" translate="no">​</a></h3>
<ul>
<li class=""><strong>Configurable <code>/invoke</code> history persistence</strong> — <code>POST /api/v1/chat/invoke</code> was always ephemeral, so reusing a <code>conversation_id</code> carried no memory across turns. A new <code>INVOKE_PERSIST_HISTORY</code> env var (default <code>false</code>) opts into the shared MongoDB-backed runtime for multi-turn history; the endpoint also now applies <code>config_override</code> and returns <code>503</code> on capacity errors instead of <code>500</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1449" target="_blank" rel="noopener noreferrer" class="">#1449</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>slack-bot</strong>: set <code>is_overthink_message</code> in <code>_route_to_agent</code> so the <code>[DEFER]</code> skip-check fires for auto-routed channel messages — previously <code>[DEFER]</code> was stripped to empty and a footer-only message was posted (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1466" target="_blank" rel="noopener noreferrer" class="">#1466</a>)</li>
<li class=""><strong>slack-bot</strong>: parse <code>attachment.blocks</code> in <code>extract_message_text</code> so the bot responds to alert integrations that post with empty <code>text</code> and all content nested inside attachment Block Kit (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1467" target="_blank" rel="noopener noreferrer" class="">#1467</a>)</li>
<li class=""><strong>escalation</strong>: use the last email match for VictorOps on-call lookup so the current on-call person is tagged when the agent reasons through multiple shifts (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1459" target="_blank" rel="noopener noreferrer" class="">#1459</a>)</li>
<li class=""><strong>agent-runtime</strong>: guard <code>delete_by_key_prefix</code> against <code>InMemoryStore</code>, which lacks the method and raised an <code>AttributeError</code> (500) on runtime init in ephemeral contexts (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1450" target="_blank" rel="noopener noreferrer" class="">#1450</a>)</li>
<li class=""><strong>skill-scanner</strong>: return HTTP 422 with actionable detail for malformed <code>SKILL.md</code> instead of a generic 500 (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1410" target="_blank" rel="noopener noreferrer" class="">#1410</a>)</li>
<li class=""><strong>ui</strong>: drop stale v1-schema MongoDB indexes on <code>workflow_runs</code>, point the workflow engine at the correct <code>DYNAMIC_AGENTS_URL</code> env var, and include cause code/message and target URL in streaming error messages (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1469" target="_blank" rel="noopener noreferrer" class="">#1469</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>Dependency and code-scanning fixes</strong> — refreshed vulnerable Python, npm, Go, and workflow dependency pins/lockfiles; redacted sensitive output and avoided raw stack traces in code-scanning findings; removed the checked-in GitHub MCP server binary (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1473" target="_blank" rel="noopener noreferrer" class="">#1473</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.13.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.14 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0413--0414">Upgrade Guide: 0.4.13 → 0.4.14<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#upgrade-guide-0413--0414" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.13 → 0.4.14" title="Direct link to Upgrade Guide: 0.4.13 → 0.4.14" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.14 is a drop-in upgrade — no <code>values.yaml</code> edits are required. There are no Helm values changes between 0.4.13 and 0.4.14.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.13 and 0.4.14. Drop-in upgrade.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No data migrations are required. As a one-time cleanup, <a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1469" target="_blank" rel="noopener noreferrer" class="">#1469</a> drops stale v1-schema indexes from the <code>workflow_runs</code> collection automatically on startup; the operation is idempotent and no operator action is needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.14 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-enable-invoke-history-persistence">2. (Optional) Enable <code>/invoke</code> history persistence<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#2-optional-enable-invoke-history-persistence" class="hash-link" aria-label="Direct link to 2-optional-enable-invoke-history-persistence" title="Direct link to 2-optional-enable-invoke-history-persistence" translate="no">​</a></h3>
<p>If you rely on multi-turn memory through <code>POST /api/v1/chat/invoke</code>, set <code>INVOKE_PERSIST_HISTORY: "true"</code> in your supervisor config. It defaults to <code>false</code> (ephemeral, no MongoDB writes).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.14#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.15 — Curl Private Endpoints]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15"/>
        <updated>2026-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-20]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-20
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.15</code>
Previous release: 0.4.14</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.15 is a small follow-up release. The <code>curl</code> builtin tool gains an opt-in <code>allow_non_public_urls</code> flag so dynamic agents can reach private or internal endpoints when explicitly configured, while domain ACLs still apply. The release also quiets noisy Jira MCP logs by default and closes several CodeQL findings by removing sensitive data from logs and stdout.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents">Dynamic Agents<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#dynamic-agents" class="hash-link" aria-label="Direct link to Dynamic Agents" title="Direct link to Dynamic Agents" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>curl</code> private-endpoint opt-in</strong> — a new per-agent <code>allow_non_public_urls</code> field (default <code>false</code>) on the <code>curl</code> builtin tool bypasses the SSRF IP-routing check so agents can reach private/internal endpoints; the domain ACL still applies, and <code>fetch_url</code> is unchanged. The field is surfaced in the agent configuration UI alongside <code>https_only</code> and <code>allowed_domains</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1476" target="_blank" rel="noopener noreferrer" class="">#1476</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>jira</strong>: default the Jira MCP server log level to <code>WARNING</code> to reduce protocol noise and lower the chance of Jira payloads appearing in logs; verbose logging stays available via <code>MCP_JIRA_LOG_LEVEL</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1475" target="_blank" rel="noopener noreferrer" class="">#1475</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>Close active CodeQL alerts</strong> — stop echoing catalog HTTP response bodies from <code>caipe-skills.py</code>, remove bearer-token stdout printing from <code>get_token.py</code> (tokens can now be written to a <code>0600</code> file), and bound scan-content API responses to sanitized severity/exit-code fields while avoiding logging of raw scan exceptions and HTTP error metadata (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1474" target="_blank" rel="noopener noreferrer" class="">#1474</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.14.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.15 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0414--0415">Upgrade Guide: 0.4.14 → 0.4.15<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#upgrade-guide-0414--0415" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.14 → 0.4.15" title="Direct link to Upgrade Guide: 0.4.14 → 0.4.15" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.15 is a drop-in upgrade — no <code>values.yaml</code> edits are required. There are no Helm values changes between 0.4.14 and 0.4.15.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.14 and 0.4.15. Drop-in upgrade.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No data migrations are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.15 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-allow-private-endpoints-for-curl">2. (Optional) Allow private endpoints for <code>curl</code><a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#2-optional-allow-private-endpoints-for-curl" class="hash-link" aria-label="Direct link to 2-optional-allow-private-endpoints-for-curl" title="Direct link to 2-optional-allow-private-endpoints-for-curl" translate="no">​</a></h3>
<p>If a dynamic agent must reach a private or internal endpoint, set <code>builtin_tools.curl.allow_non_public_urls: true</code> for that agent (default <code>false</code>). Keep <code>allowed_domains</code> scoped — the domain ACL is still enforced.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.15#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.13 — Workflow Service and Default Agent]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13"/>
        <updated>2026-05-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-18]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-18
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.13</code>
Previous release: 0.4.12</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.13 introduces the <strong>Workflow Service</strong> — a multi-step orchestration engine with a ReactFlow visual editor, fire-and-forget execution, HITL interrupts, and config-driven seeding that runs natively inside the Next.js UI. It also adds a <strong>configurable default agent</strong> so new chats can open against a chosen dynamic agent instead of the supervisor, an <strong>AI Review</strong> module that grades skills and agent prompts against an admin rubric, and a <code>curl</code> builtin tool for dynamic agents to call write APIs. Security hardening closes a class of SSRF-prone URL fetches across RAG ingestion and agent fetch tools.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-service">Workflow Service<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#workflow-service" class="hash-link" aria-label="Direct link to Workflow Service" title="Direct link to Workflow Service" translate="no">​</a></h3>
<ul>
<li class=""><strong>Workflow editor and execution engine</strong> — new ReactFlow-based visual editor with step configuration, YAML export/import, and template-variable support; a fire-and-forget execution engine with step context injection, artifact capture (<code>user_prompt.txt</code>, <code>tool_calls.txt</code>, <code>agent_output.txt</code>), <code>error.txt</code> detection, and human-in-the-loop interrupt/resume (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
<li class=""><strong>Config-driven seeding</strong> — workflows defined in <code>app-config.yaml</code> are upserted on startup as read-only (lock icon, disabled forms, warning banner) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
<li class=""><strong>Workflow tools for agents</strong> — dynamic agents can trigger and monitor workflows via builtin tools; runs surface as cards with status badges (pending, running, waiting_for_input, completed, failed, cancelled), auto-expiry, and file cleanup (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
<li class=""><strong>Langfuse session grouping</strong> — workflow steps are grouped under a single Langfuse session for end-to-end observability (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
<li class=""><strong>Feature gating</strong> — the Workflows tab is gated behind <code>WORKFLOWS_ENABLED</code> and the Task Builder tab behind <code>TASK_BUILDER_ENABLED</code>, so both stay hidden unless explicitly turned on (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configurable-default-agent">Configurable Default Agent<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#configurable-default-agent" class="hash-link" aria-label="Direct link to Configurable Default Agent" title="Direct link to Configurable Default Agent" translate="no">​</a></h3>
<ul>
<li class=""><strong>Default agent for new chats</strong> — an admin-only Settings dropdown (and the new <code>DEFAULT_AGENT_ID</code> Helm key) lets you bootstrap new chats against a specific dynamic agent. Resolution order is MongoDB <code>platform_config</code> → <code>DEFAULT_AGENT_ID</code> env var → supervisor fallback, so existing deployments are unaffected by default (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1441" target="_blank" rel="noopener noreferrer" class="">#1441</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-review">AI Review<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#ai-review" class="hash-link" aria-label="Direct link to AI Review" title="Direct link to AI Review" translate="no">​</a></h3>
<ul>
<li class=""><strong>Skill and agent prompt grading</strong> — a new AI Review module grades skill <code>SKILL.md</code> files and dynamic-agent system prompts against an admin-configurable rubric. Each criterion runs as its own LLM call, verdicts aggregate into a weighted A–F score, and results surface as GitHub-style inline comments with click-to-apply fixes. Reviews are hash-cached so unchanged content reuses the prior verdict (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1433" target="_blank" rel="noopener noreferrer" class="">#1433</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents">Dynamic Agents<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#dynamic-agents" class="hash-link" aria-label="Direct link to Dynamic Agents" title="Direct link to Dynamic Agents" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>curl</code> builtin tool</strong> — dynamic agents can now make <code>PUT</code>/<code>POST</code>/<code>PATCH</code>/<code>DELETE</code> calls (the existing <code>fetch_url</code> tool is GET-only). Disabled by default and gated behind the same domain ACL and https-only guards as <code>fetch_url</code>; enable via <code>builtin_tools.curl.enabled: true</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1413" target="_blank" rel="noopener noreferrer" class="">#1413</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rag">RAG<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#rag" class="hash-link" aria-label="Direct link to RAG" title="Direct link to RAG" translate="no">​</a></h3>
<ul>
<li class=""><strong>Slack retention window fix</strong> — Slack documents now anchor <code>fresh_until</code> to the message post time (<code>message_ts + lookback_days</code>) instead of ingestion time, giving a true rolling retention window instead of expiring historical messages ~36h after ingestion (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1435" target="_blank" rel="noopener noreferrer" class="">#1435</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>rag</strong>: expand the default trusted network CIDRs and remove the init-failure sleep (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1435" target="_blank" rel="noopener noreferrer" class="">#1435</a>)</li>
<li class=""><strong>slack-bot</strong>: skip bot thread replies to prevent duplicate responses (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1417" target="_blank" rel="noopener noreferrer" class="">#1417</a>)</li>
<li class=""><strong>dynamic-agents</strong>: emit <code>TOOL_CALL_RESULT</code> for MCP tools that return list-type content (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>SSRF hardening</strong> — public-routable host validation added to RAG <code>sanitize_url</code>, dynamic-agent <code>fetch_url</code>, the shared multi-agent <code>fetch_url_tool</code>, and the new <code>curl</code> tool; hostnames resolving to private, link-local, CGNAT, loopback, or reserved IPs are rejected. Redirect following is now validated per-hop, and a <code>SSRFProtectionMiddleware</code> was added to the Scrapy downloader pipeline so redirect-generated requests are blocked too (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1431" target="_blank" rel="noopener noreferrer" class="">#1431</a>)</li>
<li class=""><strong>Dependency CVE bumps</strong> — upgraded <code>cnoe-agent-utils</code> to 0.4.0, fixed a <code>langchain-openai</code> CVE, and refreshed vulnerable Python/npm dependency locks to clear Dependabot alerts (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1418" target="_blank" rel="noopener noreferrer" class="">#1418</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.12.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.13 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0412--0413">Upgrade Guide: 0.4.12 → 0.4.13<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#upgrade-guide-0412--0413" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.12 → 0.4.13" title="Direct link to Upgrade Guide: 0.4.12 → 0.4.13" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.13 is a drop-in upgrade. The only Helm values change is a single new optional key (<code>DEFAULT_AGENT_ID</code>) that defaults to empty and preserves existing behaviour — new chats continue to open against the supervisor unless you opt in. The Workflows and Task Builder tabs are gated behind env-var feature flags and stay hidden until enabled.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>One new optional field was added under <code>caipe-ui.config</code>. No existing keys were renamed, removed, or changed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-default-agent">New Optional: Default Agent<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#new-optional-default-agent" class="hash-link" aria-label="Direct link to New Optional: Default Agent" title="Direct link to New Optional: Default Agent" translate="no">​</a></h3>
<table><thead><tr><th>Env Var / Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>DEFAULT_AGENT_ID</code></td><td><code>""</code> (supervisor)</td><td>Bootstrap default agent for new chats. Set to a dynamic agent ID to pre-configure the default without manual admin action. Overridden at runtime by Admin → Settings.</td></tr></tbody></table>
<p>To pre-configure a default agent at deploy time:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">caipe-ui</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">DEFAULT_AGENT_ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;dynamic-agent-id&gt;"</span><br></span></code></pre></div></div>
<p>A runtime value set via <strong>Admin → Settings</strong> (stored in the MongoDB <code>platform_config</code> collection) takes precedence over this env var.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-feature-flags">Optional: Feature Flags<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#optional-feature-flags" class="hash-link" aria-label="Direct link to Optional: Feature Flags" title="Direct link to Optional: Feature Flags" translate="no">​</a></h3>
<p>The Workflows and Task Builder tabs are off by default. Enable them through the UI config when ready:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">caipe-ui</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">WORKFLOWS_ENABLED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">TASK_BUILDER_ENABLED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations are required. The <code>platform_config</code> and workflow collections self-initialize on first use.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.13 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-configure-default-agent-and-feature-flags">2. (Optional) Configure default agent and feature flags<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#2-optional-configure-default-agent-and-feature-flags" class="hash-link" aria-label="Direct link to 2. (Optional) Configure default agent and feature flags" title="Direct link to 2. (Optional) Configure default agent and feature flags" translate="no">​</a></h3>
<p>Add <code>DEFAULT_AGENT_ID</code> to <code>caipe-ui.config</code> to bootstrap a default agent, and/or set <code>WORKFLOWS_ENABLED</code> / <code>TASK_BUILDER_ENABLED</code> to surface those tabs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.13#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.4.12 → 0.4.13)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">--- values-0.4.12.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">+++ values-0.4.13.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">@@ -686,6 +686,10 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  config:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # CAIPE Supervisor URL - automatically configured to use the supervisor-agent service</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    A2A_BASE_URL: "http://ai-platform-engineering-supervisor-agent:8000"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Bootstrap default agent for new chats. Overridden at runtime by Admin → Settings UI.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Set to a dynamic agent ID to pre-configure the default without manual admin action.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # Leave empty to use the supervisor (Platform Engineer) as default.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    DEFAULT_AGENT_ID: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Skills template directory (mounted from ConfigMap)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    SKILLS_DIR: "/app/data/skills"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    # Live-skills skill template (mounted from ConfigMap "skills-live-skills").</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.12 — LiteLLM FinOps MCP Server]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12"/>
        <updated>2026-05-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-13]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-13
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.12</code>
Previous release: 0.4.11</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.12 adds a standalone LiteLLM MCP server for FinOps reporting, letting dynamic agents query LiteLLM cost and usage data directly. The chart gains a new optional <code>litellmMcp</code> section — disabled by default — so existing deployments are unaffected until you opt in. Dynamic agents now expose their persisted agent ID through the <code>self_identity</code> tool. This is a drop-in Helm upgrade; the only values change is the new opt-in <code>litellmMcp</code> block.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="litellm-finops-mcp">LiteLLM FinOps MCP<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#litellm-finops-mcp" class="hash-link" aria-label="Direct link to LiteLLM FinOps MCP" title="Direct link to LiteLLM FinOps MCP" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>mcp-litellm</code> server</strong> — new standalone MCP server (<code>ghcr.io/cnoe-io/mcp-litellm</code>) exposing LiteLLM FinOps reporting tools for cost and usage analysis; enable it when dynamic agents should call LiteLLM tools directly. Ships with theme-aware FinOps workflow images and improved LiteLLM FinOps report exports. Deployed via the new optional <code>litellmMcp</code> Helm section (<code>enabled: false</code> by default) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1402" target="_blank" rel="noopener noreferrer" class="">#1402</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents">Dynamic Agents<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#dynamic-agents" class="hash-link" aria-label="Direct link to Dynamic Agents" title="Direct link to Dynamic Agents" translate="no">​</a></h3>
<ul>
<li class=""><strong>Agent ID in self-identity</strong> — the <code>self_identity</code> built-in tool now returns the persisted dynamic agent ID, so an agent can reliably report which agent it is (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1403" target="_blank" rel="noopener noreferrer" class="">#1403</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>litellm</strong>: sanitize example values that resembled secrets in the LiteLLM MCP configuration so shipped examples no longer look like real API keys (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1402" target="_blank" rel="noopener noreferrer" class="">#1402</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.11.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.12 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0411--0412">Upgrade Guide: 0.4.11 → 0.4.12<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#upgrade-guide-0411--0412" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.11 → 0.4.12" title="Direct link to Upgrade Guide: 0.4.11 → 0.4.12" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.12 is a drop-in upgrade for existing deployments. It adds one new optional chart section — <code>litellmMcp</code> — which is disabled by default. No existing keys are renamed, removed, or changed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>One new optional section was added. Nothing else changed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-litellm-mcp">New Optional: LiteLLM MCP<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#new-optional-litellm-mcp" class="hash-link" aria-label="Direct link to New Optional: LiteLLM MCP" title="Direct link to New Optional: LiteLLM MCP" translate="no">​</a></h3>
<p>The <code>litellmMcp</code> block deploys the standalone LiteLLM FinOps MCP server. It is <code>enabled: false</code> by default, so no action is required unless you want it.</p>
<table><thead><tr><th>Key</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>litellmMcp.enabled</code></td><td><code>false</code></td><td>Deploy the LiteLLM MCP server</td></tr><tr><td><code>litellmMcp.image.repository</code></td><td><code>ghcr.io/cnoe-io/mcp-litellm</code></td><td>Server image</td></tr><tr><td><code>litellmMcp.service.port</code></td><td><code>8000</code></td><td>Service port</td></tr><tr><td><code>litellmMcp.config.LITELLM_API_URL</code></td><td><code>""</code></td><td>LiteLLM API base URL</td></tr><tr><td><code>litellmMcp.config.LITELLM_API_TIMEOUT</code></td><td><code>"120"</code></td><td>Request timeout (seconds)</td></tr><tr><td><code>litellmMcp.config.LITELLM_VERIFY_SSL</code></td><td><code>"true"</code></td><td>Verify TLS on the LiteLLM API</td></tr><tr><td><code>litellmMcp.existingSecret</code></td><td><code>""</code></td><td>Existing Secret holding <code>LITELLM_API_KEY</code> (preferred in shared clusters)</td></tr><tr><td><code>litellmMcp.externalSecrets.enabled</code></td><td><code>false</code></td><td>Source <code>LITELLM_API_KEY</code> from a <code>ClusterSecretStore</code> (e.g. Vault)</td></tr></tbody></table>
<p>To enable it in your <code>values.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">litellmMcp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">LITELLM_API_URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://litellm.example.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Prefer an existing Secret or externalSecrets for the API key in shared clusters</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">existingSecret</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"litellm-mcp"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># externalSecrets:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#   enabled: true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#   data:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#     - secretKey: LITELLM_API_KEY</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#       remoteRef:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#         key: dev/litellm-mcp</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#         property: LITELLM_API_KEY</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.12 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-enable-the-litellm-mcp-server">2. (Optional) Enable the LiteLLM MCP server<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#2-optional-enable-the-litellm-mcp-server" class="hash-link" aria-label="Direct link to 2. (Optional) Enable the LiteLLM MCP server" title="Direct link to 2. (Optional) Enable the LiteLLM MCP server" translate="no">​</a></h3>
<p>Set <code>litellmMcp.enabled: true</code> and provide <code>LITELLM_API_URL</code> plus the <code>LITELLM_API_KEY</code> (via <code>existingSecret</code> or <code>externalSecrets</code>) if you want dynamic agents to query LiteLLM FinOps data.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># If you enabled it, confirm the LiteLLM MCP server is running</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get deploy </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> litellm-mcp</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.12#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.4.11 → 0.4.12)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">@@ -793,6 +793,80 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">        #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">        #     key: dev/mongodb</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">        #     property: password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">######### LiteLLM MCP configuration #########</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Standalone MCP server for LiteLLM FinOps reporting.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># Enable this when dynamic agents should call LiteLLM tools directly.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">litellmMcp:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  nameOverride: "litellm-mcp"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  fullnameOverride: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  replicaCount: 1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  revisionHistoryLimit: 3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  image:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    repository: "ghcr.io/cnoe-io/mcp-litellm"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    # tag defaults to .Chart.AppVersion when not specified</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tag: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    pullPolicy: "IfNotPresent"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  imagePullSecrets: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  service:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    type: ClusterIP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    port: 8000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Non-sensitive environment variables.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  config:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    SERVER_NAME: "LITELLM"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    LITELLM_API_URL: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    LITELLM_API_TIMEOUT: "120"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    LITELLM_VERIFY_SSL: "true"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Existing Secret containing LITELLM_API_KEY. Takes precedence over secret.name.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  existingSecret: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # Simple Secret creation for local/dev installs. Prefer existingSecret or</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  # externalSecrets in shared clusters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  secret:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    create: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    name: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    data: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # LITELLM_API_KEY: ""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  externalSecrets:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    enabled: false</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    apiVersion: "v1beta1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    refreshInterval: "1h"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    secretStoreRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      name: "vault"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      kind: "ClusterSecretStore"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    data: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      # - secretKey: LITELLM_API_KEY</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #   remoteRef:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     key: dev/litellm-mcp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      #     property: LITELLM_API_KEY</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  podAnnotations: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  podLabels: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  podSecurityContext: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  securityContext: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  resources: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  livenessProbe:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tcpSocket:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      port: http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    initialDelaySeconds: 30</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    periodSeconds: 10</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  readinessProbe:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    tcpSocket:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">      port: http</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    initialDelaySeconds: 5</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">    periodSeconds: 5</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  nodeSelector: {}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  tolerations: []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">  affinity: {}</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.11 — Skills Gallery Controls & Cleaner Metrics]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11"/>
        <updated>2026-05-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-12]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-12
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.11</code>
Previous release: 0.4.10</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.11 gives operators finer control over which skills appear in the Skills Gallery: a new <code>HIDE_BUILTIN_SKILLS</code> flag and a default of <code>BUILTIN_SKILL_IDS: "none"</code> keep built-in templates out of the gallery until you import them explicitly. The VictorOps MCP is consolidated around the v2 incidents reporting API and stops silently dropping fields. Several charts fixes stop Prometheus from firing spurious <code>TargetDown</code> alerts on services that never exposed <code>/metrics</code>, and the session-expiry sign-in flow no longer relies on a brittle new-tab refresh. This is a drop-in Helm upgrade — no <code>values.yaml</code> edits are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-gallery">Skills Gallery<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#skills-gallery" class="hash-link" aria-label="Direct link to Skills Gallery" title="Direct link to Skills Gallery" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>HIDE_BUILTIN_SKILLS</code> flag</strong> — when set to <code>true</code>, <code>GET /api/skills</code> skips loading disk-based skill templates so built-in skills do not appear in the gallery; operators load them on demand via <strong>Import template skills</strong>. Pairs cleanly with <code>BUILTIN_SKILL_IDS=none</code> for an empty starting gallery. The same PR also lets <code>X-Caipe-Catalog-Key</code> holders call <code>POST /skills/refresh</code> without a browser OIDC session — the catalog key is still validated against MongoDB, so security is unchanged (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1383" target="_blank" rel="noopener noreferrer" class="">#1383</a>)</li>
<li class=""><strong>Built-in skill auto-seeding off by default</strong> — the <code>caipe-ui</code> chart now defaults <code>BUILTIN_SKILL_IDS: "none"</code>, disabling automatic seeding of template skills on startup. Restore the previous behavior with <code>BUILTIN_SKILL_IDS: ""</code> (seed all) or a comma-separated allow-list of template IDs (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1382" target="_blank" rel="noopener noreferrer" class="">#1382</a>)</li>
<li class=""><strong>Streamlined Skills Gateway quick-install</strong> — a series of refinements to the <code>/skills</code> gateway page: simplified quick-install flow, clearer API-key gating, collapsed advanced options, and corrected launch guidance (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1399" target="_blank" rel="noopener noreferrer" class="">#1399</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="victorops">VictorOps<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#victorops" class="hash-link" aria-label="Direct link to VictorOps" title="Direct link to VictorOps" translate="no">​</a></h3>
<ul>
<li class=""><strong>Consolidated v2 incident reporting</strong> — <code>get_api_reporting_v2_incidents</code> becomes the single incident-query tool with <code>all_orgs=True</code> fan-out (per-org payloads under <code>by_org[slug]</code>, per-org errors under <code>errors[slug]</code>, plus a <code>total_count_by_phase</code> summary). Removes redundant v1 GET endpoints and drops slim/projection logic that was silently dropping fields (notably the on-call user's name); all tools now return pretty-printed JSON so <code>grep</code>/<code>glob</code> over results works again (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1377" target="_blank" rel="noopener noreferrer" class="">#1377</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>auth</strong>: replace the brittle "Refresh in New Tab" session-expiry flow with a current-tab sign-in that preserves the user's URL and shows a visible countdown when silent token refresh fails, routing through <code>/login?session_expired=true</code> to avoid AuthGuard redirect loops (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1386" target="_blank" rel="noopener noreferrer" class="">#1386</a>)</li>
<li class=""><strong>charts</strong>: exclude <code>rag-server</code>, <code>agent-ontology</code>, and <code>skill-scanner</code> from ServiceMonitor scraping — these services do not expose <code>/metrics</code>, so Prometheus was recording <code>up=0</code> and firing <code>TargetDown</code> for healthy pods (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1388" target="_blank" rel="noopener noreferrer" class="">#1388</a>)</li>
<li class=""><strong>charts</strong>: exclude <code>caipe-ui</code> from ServiceMonitor scraping for the same reason (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1394" target="_blank" rel="noopener noreferrer" class="">#1394</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.10.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.11 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-0410--0411">Upgrade Guide: 0.4.10 → 0.4.11<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#upgrade-guide-0410--0411" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.10 → 0.4.11" title="Direct link to Upgrade Guide: 0.4.10 → 0.4.11" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.11 is a drop-in Helm upgrade. The only chart values change is a cosmetic comment update ("Skills API Gateway" → "Skills Gateway"). The new Skills Gallery behavior is driven by <code>caipe-ui</code> env vars (<code>HIDE_BUILTIN_SKILLS</code>, <code>BUILTIN_SKILL_IDS</code>), not by new top-level chart keys.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No functional Helm values changes between 0.4.10 and 0.4.11 — the only diff is a comment label updated to "Skills Gateway". Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-control-built-in-skills-in-the-gallery">Optional: control built-in skills in the gallery<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#optional-control-built-in-skills-in-the-gallery" class="hash-link" aria-label="Direct link to Optional: control built-in skills in the gallery" title="Direct link to Optional: control built-in skills in the gallery" translate="no">​</a></h3>
<p>These <code>caipe-ui</code> config values changed defaults / gained meaning in this release:</p>
<table><thead><tr><th>Env Var</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>BUILTIN_SKILL_IDS</code></td><td><code>"none"</code></td><td>Which built-in template skills to auto-seed on startup. <code>"none"</code> = seed none; <code>""</code> = seed all; comma-separated list = seed specific IDs</td></tr><tr><td><code>HIDE_BUILTIN_SKILLS</code></td><td>unset (<code>false</code>)</td><td>When <code>true</code>, hides built-in skill templates from <code>GET /api/skills</code> / the gallery until imported via <strong>Import template skills</strong></td></tr></tbody></table>
<p>To restore pre-0.4.11 auto-seeding behavior, set <code>BUILTIN_SKILL_IDS: ""</code> in your <code>caipe-ui</code> config.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.11 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-decide-on-built-in-skill-seeding">2. (Optional) Decide on built-in skill seeding<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#2-optional-decide-on-built-in-skill-seeding" class="hash-link" aria-label="Direct link to 2. (Optional) Decide on built-in skill seeding" title="Direct link to 2. (Optional) Decide on built-in skill seeding" translate="no">​</a></h3>
<p>If you rely on built-in template skills appearing automatically, set <code>BUILTIN_SKILL_IDS: ""</code> (or an explicit allow-list) in your <code>caipe-ui</code> config. Otherwise, the gallery starts empty and templates are imported on demand.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Confirm the previously noisy services are no longer scraped as down</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get servicemonitor </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-values-diff">Full Values Diff<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.11#full-values-diff" class="hash-link" aria-label="Direct link to Full Values Diff" title="Direct link to Full Values Diff" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Raw diff (0.4.10 → 0.4.11)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token coord">@@ -217,7 +217,7 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># ---------------------------------------------------------------------------</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># Live-skills command template (rendered as the `/skills` slash command</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"># in the "Skills API Gateway" UI page). Customizable per-deployment.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"># in the "Skills Gateway" UI page). Customizable per-deployment.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">#</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># Resolution order (mirrors promptConfig):</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">#   1. .Values.skillsLiveSkills          - inline multi-line string (highest)</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.10 — Overthink Boilerplate Template Variable]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10"/>
        <updated>2026-05-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-08]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-08
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.10</code>
Previous release: 0.4.9</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.10 reworks how "overthink" gating instructions reach agent prompts. Instead of a per-config <code>custom_prompt</code> string, the platform now injects a built-in <code>OVERTHINK_BOILERPLATE</code> template variable server-side, so agent prompts can opt into standard <code>[DEFER]</code>/<code>[LOW_CONFIDENCE]</code> gating with a single <code>{{ client_context.overthink_boilerplate }}</code> reference. A follow-up fix relocates that logic from the agent runtime to the slack-bot, where it belongs. This is a drop-in Helm upgrade — no <code>values.yaml</code> edits are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="overthink">Overthink<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#overthink" class="hash-link" aria-label="Direct link to Overthink" title="Direct link to Overthink" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>OVERTHINK_BOILERPLATE</code> template variable</strong> — replaces the removed <code>custom_prompt</code> field on <code>OverthinkConfig</code> with a built-in boilerplate injected into every system-prompt render context. Agent prompts using <code>overthink: enabled: true</code> can include <code>{{ client_context.overthink_boilerplate }}</code> to get standard <code>[DEFER]</code>/<code>[LOW_CONFIDENCE]</code> gating instructions without coupling the prompt to platform marker conventions; the variable is always available and silently ignored when not referenced (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1364" target="_blank" rel="noopener noreferrer" class="">#1364</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>overthink</strong>: move the <code>OVERTHINK_BOILERPLATE</code> constant out of <code>agent_runtime.py</code> and into the slack-bot, injecting <code>overthink_boilerplate</code> into <code>client_context</code> only when <code>overthink.enabled</code> is true — the runtime treats <code>client_context</code> as an opaque dict and should not own this logic, so the slack-bot can now evolve independently of the runtime (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1369" target="_blank" rel="noopener noreferrer" class="">#1369</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p><strong>Removed: <code>overthink.custom_prompt</code> (slack-bot config).</strong> The <code>custom_prompt</code> field was removed from <code>OverthinkConfig</code>. This only affects deployments that explicitly set it in their slack-bot configuration.</p>
<p><strong>Before (0.4.9):</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">overthink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">custom_prompt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Defer to a human when uncertain..."</span><br></span></code></pre></div></div>
<p><strong>After (0.4.10):</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">overthink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># custom_prompt removed — reference the built-in boilerplate in your agent's</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># system prompt instead:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">#   {{ client_context.overthink_boilerplate }}</span><br></span></code></pre></div></div>
<p><strong>Consequence:</strong> If you leave <code>custom_prompt</code> in place, it is no longer applied, and your previous gating instructions will not reach the prompt. Add <code>{{ client_context.overthink_boilerplate }}</code> to the agent's system prompt to restore standard <code>[DEFER]</code>/<code>[LOW_CONFIDENCE]</code> gating. No Helm chart values are affected.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-049--0410">Upgrade Guide: 0.4.9 → 0.4.10<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#upgrade-guide-049--0410" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.9 → 0.4.10" title="Direct link to Upgrade Guide: 0.4.9 → 0.4.10" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.10 is a drop-in Helm upgrade. The only operator-visible change is the removal of the slack-bot <code>overthink.custom_prompt</code> field, replaced by the server-injected <code>{{ client_context.overthink_boilerplate }}</code> template variable. No chart <code>values.yaml</code> edits are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.9 and 0.4.10. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-if-you-used-overthinkcustom_prompt-update-your-agent-prompt">2. (If you used <code>overthink.custom_prompt</code>) Update your agent prompt<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#2-if-you-used-overthinkcustom_prompt-update-your-agent-prompt" class="hash-link" aria-label="Direct link to 2-if-you-used-overthinkcustom_prompt-update-your-agent-prompt" title="Direct link to 2-if-you-used-overthinkcustom_prompt-update-your-agent-prompt" translate="no">​</a></h3>
<p>Remove <code>custom_prompt</code> from your slack-bot <code>overthink</code> config and add the boilerplate reference to the agent's system prompt:</p>
<div class="language-jinja codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jinja codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{ client_context.overthink_boilerplate }}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.10#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.9 — HITL Tool Approval, GridFS, and Docs Redesign]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9"/>
        <updated>2026-05-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-07]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-07
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.9</code>
Previous release: 0.4.8</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.9 ships Human-in-the-Loop tool approval for dynamic agents, a GridFS-backed store for large tool results, custom agent color themes, an improved agent-selection UX, an automated <code>release-docs</code> coding-agent skill, and a fully redesigned documentation site.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="human-in-the-loop-hitl-tool-approval">Human-in-the-Loop (HITL) Tool Approval<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#human-in-the-loop-hitl-tool-approval" class="hash-link" aria-label="Direct link to Human-in-the-Loop (HITL) Tool Approval" title="Direct link to Human-in-the-Loop (HITL) Tool Approval" translate="no">​</a></h3>
<ul>
<li class=""><strong>Configurable <code>interrupt_on</code> per agent</strong> — admins can require explicit approval before specific MCP tools execute; the agent pauses mid-run and waits for a human accept/reject</li>
<li class=""><strong>Tool approval card UI</strong> — new <code>ToolApprovalCard</code> component surfaces the pending tool call with its arguments; timeline expands during wait and collapses on resume</li>
<li class=""><strong>Interrupt config picker</strong> — new "Advanced" step in the agent editor lets you select which tools require approval without touching YAML</li>
<li class=""><strong>Invoke endpoint hardening</strong> — <code>/invoke</code> now detects HITL interrupts and returns a clear error rather than hanging (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1351" target="_blank" rel="noopener noreferrer" class="">#1351</a> by <a href="https://github.com/subbaksh" target="_blank" rel="noopener noreferrer" class="">@subbaksh</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gridfs-backend-for-large-tool-results">GridFS Backend for Large Tool Results<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#gridfs-backend-for-large-tool-results" class="hash-link" aria-label="Direct link to GridFS Backend for Large Tool Results" title="Direct link to GridFS Backend for Large Tool Results" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>MongoDBGridFSStore</code></strong> — stores tool results in MongoDB GridFS, bypassing the 16 MB document limit that caused checkpoint failures for large LLM outputs</li>
<li class="">Enabled by default via <code>USE_GRIDFS_BACKEND=true</code>; can be toggled off for smaller deployments</li>
<li class=""><strong><code>format_file</code> builtin tool</strong> — reformats single-line blobs into newline-delimited output, making grep-friendly file searching possible from within an agent run</li>
<li class=""><strong>TTL index</strong> — files auto-expire after 48 hours; no manual cleanup needed (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1351" target="_blank" rel="noopener noreferrer" class="">#1351</a> by <a href="https://github.com/subbaksh" target="_blank" rel="noopener noreferrer" class="">@subbaksh</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-agent-color-themes">Custom Agent Color Themes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#custom-agent-color-themes" class="hash-link" aria-label="Direct link to Custom Agent Color Themes" title="Direct link to Custom Agent Color Themes" translate="no">​</a></h3>
<ul>
<li class=""><strong>Custom theme option</strong> — replaces the fixed "midnight" preset; each agent can now carry its own gradient and bot-icon tint</li>
<li class=""><strong>Color picker popover</strong> — live preview of <code>from</code> / <code>to</code> gradient colors and accent; AI suggest can generate a full color scheme from a natural-language description</li>
<li class="">Avatar rendering updated everywhere to pick up per-agent accent color (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1351" target="_blank" rel="noopener noreferrer" class="">#1351</a> by <a href="https://github.com/subbaksh" target="_blank" rel="noopener noreferrer" class="">@subbaksh</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent-selection-search--scroll">Agent Selection Search &amp; Scroll<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#agent-selection-search--scroll" class="hash-link" aria-label="Direct link to Agent Selection Search &amp; Scroll" title="Direct link to Agent Selection Search &amp; Scroll" translate="no">​</a></h3>
<ul>
<li class=""><strong>Search input</strong> — auto-focuses when the agent dropdown opens; filters both the Platform Engineer default and all dynamic agents by name or description</li>
<li class=""><strong>Scrollable list</strong> — agent list is capped at <code>max-h-64</code> with <code>overflow-y-auto</code>; no more overflow when many agents are configured</li>
<li class="">Search state clears on selection or close (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1361" target="_blank" rel="noopener noreferrer" class="">#1361</a> by <a href="https://github.com/kevkantes" target="_blank" rel="noopener noreferrer" class="">@kevkantes</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-docs-coding-agent-skill"><code>release-docs</code> Coding-Agent Skill<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#release-docs-coding-agent-skill" class="hash-link" aria-label="Direct link to release-docs-coding-agent-skill" title="Direct link to release-docs-coding-agent-skill" translate="no">​</a></h3>
<ul>
<li class="">New <code>.claude/skills/release-docs/SKILL.md</code> — invoke <code>/release-docs</code> in Claude Code to generate a release blog post and upgrade guide from git history; wired into <code>docs-release.yml</code> CI so a post is opened automatically on every stable tag (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1356" target="_blank" rel="noopener noreferrer" class="">#1356</a> by <a href="https://github.com/sriaradhyula" target="_blank" rel="noopener noreferrer" class="">@sriaradhyula</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-site-redesign">Documentation Site Redesign<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#documentation-site-redesign" class="hash-link" aria-label="Direct link to Documentation Site Redesign" title="Direct link to Documentation Site Redesign" translate="no">​</a></h3>
<ul>
<li class=""><strong>3-column hero</strong> — tagline + CTAs | live demo GIF with fullscreen lightbox | install code blocks (curl / Kubernetes Helm / Kind)</li>
<li class=""><strong>Live GitHub star count</strong> with rate-limit guard</li>
<li class=""><strong>Compact 11-feature grid</strong> replacing the previous 6-tile layout</li>
<li class=""><strong>Multi-version docs</strong> — 0.4.9 as Latest, <code>main 🚧</code> accessible at <code>/docs/next/</code></li>
<li class=""><strong>Repo Ops section</strong> under Development — CI workflows reference, release guide, and coding-agent skills catalogue</li>
<li class=""><strong>Prebuild flow doc</strong> — full guide to <code>prebuild/*</code> image and Helm chart CI</li>
<li class="">GIF demo hosted on GitHub release assets (not a binary blob in the repo) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1359" target="_blank" rel="noopener noreferrer" class="">#1359</a> by <a href="https://github.com/sriaradhyula" target="_blank" rel="noopener noreferrer" class="">@sriaradhyula</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>ingestor</strong>: prevent <code>UnboundLocalError</code> in the <code>finally</code> block when <code>client.initialize()</code> fails before the client variable is set — caused silent crashes on misconfigured ingestor startup (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1357" target="_blank" rel="noopener noreferrer" class="">#1357</a> by <a href="https://github.com/sriaradhyula" target="_blank" rel="noopener noreferrer" class="">@sriaradhyula</a>)</li>
<li class=""><strong>docs</strong>: escape MDX angle bracket in spec plan template; add <code>docs-build-check.yml</code> workflow to catch broken Docusaurus builds on PRs touching <code>docs/</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1360" target="_blank" rel="noopener noreferrer" class="">#1360</a> by <a href="https://github.com/sriaradhyula" target="_blank" rel="noopener noreferrer" class="">@sriaradhyula</a>)</li>
<li class=""><strong>dynamic-agents</strong>: centralised LLM instantiation via <code>llm_clients.get_llm</code> — fixes a subagent model config bug where the wrong model was used when <code>AGENT_MODEL</code> differed from <code>SUPERVISOR_MODEL</code>; inlined <code>StreamingMixin</code>; removed dead models and state (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1351" target="_blank" rel="noopener noreferrer" class="">#1351</a> by <a href="https://github.com/subbaksh" target="_blank" rel="noopener noreferrer" class="">@subbaksh</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.8.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.9 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-048--049">Upgrade Guide: 0.4.8 → 0.4.9<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#upgrade-guide-048--049" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.8 → 0.4.9" title="Direct link to Upgrade Guide: 0.4.8 → 0.4.9" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h3>
<p>0.4.9 adds HITL tool approval and GridFS backend for dynamic agents, plus UI improvements and docs updates. No Helm values changes are required — new features default to enabled and existing deployments continue to work without modification.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h3>
<p>No breaking Helm values changes. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-gridfs-backend">New Optional: GridFS Backend<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#new-optional-gridfs-backend" class="hash-link" aria-label="Direct link to New Optional: GridFS Backend" title="Direct link to New Optional: GridFS Backend" translate="no">​</a></h4>
<p>GridFS is enabled by default. To disable it (e.g., if your MongoDB instance doesn't support GridFS):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">dynamic-agents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">USE_GRIDFS_BACKEND</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"false"</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-hitl-tool-approval">New Optional: HITL Tool Approval<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#new-optional-hitl-tool-approval" class="hash-link" aria-label="Direct link to New Optional: HITL Tool Approval" title="Direct link to New Optional: HITL Tool Approval" translate="no">​</a></h4>
<p>To require human approval before a specific tool executes, set <code>interrupt_on</code> in the agent config via the agent editor UI, or in your agent YAML:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">interrupt_on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">tool_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-sensitive-tool"</span><br></span></code></pre></div></div>
<p>No Helm chart changes needed — this is per-agent configuration managed at runtime.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-version-docs">Multi-Version Docs<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.9#multi-version-docs" class="hash-link" aria-label="Direct link to Multi-Version Docs" title="Direct link to Multi-Version Docs" translate="no">​</a></h3>
<p>The documentation site now serves 0.4.9 as the default (Latest) version. The previous <code>main</code>-based docs are accessible at <code>/docs/next/</code>. If you have bookmarks to versioned doc URLs, they will continue to work.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.8 — AWS MCP Server and PSS Baseline]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8"/>
        <updated>2026-05-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-06]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-06
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.8</code>
Previous release: 0.4.7</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.8 introduces a new AWS MCP server, configurable call-limit middlewares for the supervisor, and Kubernetes Pod Security Standards Baseline compliance across all Helm charts. A tracing fix resolves silent OTLP batch drops to Langfuse caused by oversized spans, and several long-standing compatibility and correctness bugs are resolved.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-mcp-server">AWS MCP Server<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#aws-mcp-server" class="hash-link" aria-label="Direct link to AWS MCP Server" title="Direct link to AWS MCP Server" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>mcp-aws</code> agent</strong> — new FastMCP server exposing <code>aws_cli_execute</code> and <code>eks_kubectl_execute</code> as MCP tools over HTTP/SSE; supports opt-in <code>INSTALL_AWS_CLI=true</code> / <code>INSTALL_KUBECTL=true</code> Docker build args; automatically built as <code>ghcr.io/cnoe-io/mcp-aws</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1324" target="_blank" rel="noopener noreferrer" class="">#1324</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supervisor-call-limit-middlewares">Supervisor Call-Limit Middlewares<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#supervisor-call-limit-middlewares" class="hash-link" aria-label="Direct link to Supervisor Call-Limit Middlewares" title="Direct link to Supervisor Call-Limit Middlewares" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>ToolCallLimitMiddleware</code></strong> — caps total tool invocations per run via <code>TOOL_CALL_LIMIT</code> env var; prevents agents from hammering external tools in a loop</li>
<li class=""><strong><code>ModelCallLimitMiddleware</code></strong> — caps total LLM inference calls per run via <code>MODEL_CALL_LIMIT</code> env var; prevents infinite reasoning loops</li>
<li class=""><strong><code>SummarizationMiddleware</code></strong> (opt-in) — compresses conversation history when approaching token/message thresholds; uses the same model as the supervisor</li>
<li class="">All limits individually toggleable and configurable via env vars / Helm configmap (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1319" target="_blank" rel="noopener noreferrer" class="">#1319</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-pod-security-standards">Kubernetes Pod Security Standards<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#kubernetes-pod-security-standards" class="hash-link" aria-label="Direct link to Kubernetes Pod Security Standards" title="Direct link to Kubernetes Pod Security Standards" translate="no">​</a></h3>
<ul>
<li class=""><strong>PSS Baseline compliance</strong> — all Helm chart subcharts now set default <code>securityContext</code> satisfying the PSS Baseline profile; Restricted profile requirements met except <code>readOnlyRootFilesystem</code> (left <code>false</code> for agents that write to the filesystem at runtime) (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1337" target="_blank" rel="noopener noreferrer" class="">#1337</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-gateway">Skills Gateway<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#skills-gateway" class="hash-link" aria-label="Direct link to Skills Gateway" title="Direct link to Skills Gateway" translate="no">​</a></h3>
<ul>
<li class=""><strong>Admin scan override</strong> — force-trigger a skills scan from the admin UI without waiting for the scheduled interval</li>
<li class=""><strong>Hub-crawl pagination and caps</strong> — GitLab tree API now paginated up to <code>max_tree_pages</code>; GitHub <code>truncated: true</code> flag detected; both providers surface truncation status in the UI</li>
<li class=""><strong>Live crawl console</strong> — real-time crawl output visible in the admin UI (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1338" target="_blank" rel="noopener noreferrer" class="">#1338</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>tracing</strong>: surgical content scrubbing in a new <code>SkillScrubberSpanProcessor</code> removes skill/workflow content from OTLP spans before export; hard cap on span attribute size prevents 413 drops to Langfuse (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1330" target="_blank" rel="noopener noreferrer" class="">#1330</a>)</li>
<li class=""><strong>mcp</strong>: remove trailing slash from default HTTP MCP path — FastMCP issues a 307 redirect for <code>/mcp/</code>; streamable-http clients do not follow redirects, causing tool-load failures on startup (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1339" target="_blank" rel="noopener noreferrer" class="">#1339</a>)</li>
<li class=""><strong>ui</strong>: suppress synthetic <code>"Task &lt;status&gt; (ID: ...)"</code> filler messages in chat — these placeholders from A2A <code>Task</code> events with no artifacts were showing as actual agent output (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1275" target="_blank" rel="noopener noreferrer" class="">#1275</a>)</li>
<li class=""><strong>slack-bot</strong>: use correct Slack mention syntax for subteam/usergroup IDs (<code>&lt;!subteam^{id}&gt;</code>) vs individual users (<code>&lt;@{id}&gt;</code>) in escalation messages (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1341" target="_blank" rel="noopener noreferrer" class="">#1341</a>)</li>
<li class=""><strong>setup</strong>: replace bash 4+ case conversion (<code>${var,,}</code>) with POSIX-compatible <code>tr</code> — fixes silent failures on macOS bash 3.2 for back-navigation and "all" agent selection (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1340" target="_blank" rel="noopener noreferrer" class="">#1340</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.7.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known at this time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.8 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-047--048">Upgrade Guide: 0.4.7 → 0.4.8<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#upgrade-guide-047--048" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.7 → 0.4.8" title="Direct link to Upgrade Guide: 0.4.7 → 0.4.8" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.8 adds the AWS MCP server, supervisor call-limit middlewares, and Kubernetes PSS Baseline security contexts across all charts. No Helm values changes are required for existing deployments — the new middlewares default to disabled and PSS security contexts are applied automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No breaking Helm values changes between 0.4.7 and 0.4.8. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-optional-supervisor-call-limits">New Optional: Supervisor Call Limits<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#new-optional-supervisor-call-limits" class="hash-link" aria-label="Direct link to New Optional: Supervisor Call Limits" title="Direct link to New Optional: Supervisor Call Limits" translate="no">​</a></h3>
<p>Two new environment variables (configurable via <code>supervisor-agent.config</code> in your values file) control per-run limits:</p>
<table><thead><tr><th>Env Var</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>TOOL_CALL_LIMIT</code></td><td><code>0</code> (disabled)</td><td>Max tool invocations per run; <code>0</code> = unlimited</td></tr><tr><td><code>MODEL_CALL_LIMIT</code></td><td><code>0</code> (disabled)</td><td>Max LLM inference calls per run; <code>0</code> = unlimited</td></tr><tr><td><code>SUMMARIZATION_ENABLED</code></td><td><code>false</code></td><td>Enable history summarization when approaching token limits</td></tr></tbody></table>
<p>To enable limits in your <code>values.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">supervisor-agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">TOOL_CALL_LIMIT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"50"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">MODEL_CALL_LIMIT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"20"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pss-baseline-security-contexts">PSS Baseline Security Contexts<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#pss-baseline-security-contexts" class="hash-link" aria-label="Direct link to PSS Baseline Security Contexts" title="Direct link to PSS Baseline Security Contexts" translate="no">​</a></h3>
<p>All chart subcharts now set default <code>securityContext</code> values satisfying the Kubernetes PSS Baseline profile. For operators running <code>readOnlyRootFilesystem: true</code> in a custom policy, note that this is intentionally left <code>false</code> because several agents write to the filesystem at runtime. No <code>values.yaml</code> changes are needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.8 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-enable-call-limits">2. (Optional) Enable call limits<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#2-optional-enable-call-limits" class="hash-link" aria-label="Direct link to 2. (Optional) Enable call limits" title="Direct link to 2. (Optional) Enable call limits" translate="no">​</a></h3>
<p>Add <code>TOOL_CALL_LIMIT</code> and/or <code>MODEL_CALL_LIMIT</code> to your <code>supervisor-agent.config</code> block if you want to cap agent run lengths.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-verify">3. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.8#3-verify" class="hash-link" aria-label="Direct link to 3. Verify" title="Direct link to 3. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Confirm mcp-aws is running (if you include it in your agent config)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get deploy </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> mcp-aws</span><br></span></code></pre></div></div>
<p>Check that no pods are blocked by PSS admission — existing charts already have compatible defaults.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.6 — Installer UX and Runtime Simplification]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6"/>
        <updated>2026-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-05]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-05
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.6</code>
Previous release: 0.4.5</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.6 significantly improves the <code>setup-caipe.sh</code> installer experience with Docker auto-detection, back-navigation, and upgrade-aware prompts. The dynamic agents runtime is simplified with a shared-client memory model, lazy provider loading, and a single-flight init pattern that prevents duplicate runtime startup. Several UI agent editor polish items round out the release.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-installer-ux">Setup Installer UX<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#setup-installer-ux" class="hash-link" aria-label="Direct link to Setup Installer UX" title="Direct link to Setup Installer UX" translate="no">​</a></h3>
<ul>
<li class=""><strong>Auto-detect and install Docker</strong> on Linux (apt/dnf) and macOS (Homebrew); detect when the user is not in the <code>docker</code> group and offer to add them</li>
<li class=""><strong>Back-navigation</strong> — type <code>0</code>, <code>b</code>, or <code>back</code> at any wizard prompt to return to the previous step</li>
<li class=""><strong>Upgrade detection</strong> — re-runs skip redundant prompts by detecting the existing deployment state; EKS node kubeconfig symlinks detected and offered a writable replacement (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1336" target="_blank" rel="noopener noreferrer" class="">#1336</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents-runtime-simplification">Dynamic Agents: Runtime Simplification<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#dynamic-agents-runtime-simplification" class="hash-link" aria-label="Direct link to Dynamic Agents: Runtime Simplification" title="Direct link to Dynamic Agents: Runtime Simplification" translate="no">​</a></h3>
<ul>
<li class=""><strong>Shared clients and lazy provider loading</strong> — <code>llm_clients</code> refactored; provider guard removed; uses <code>cnoe-agent-utils 0.4.0</code> lazy imports</li>
<li class=""><strong>Single-flight initialization</strong> — prevents duplicate runtime init via a future-based lock</li>
<li class=""><strong>Reduced retry latency</strong> — <code>Retry-After</code> reduced from 10s to 5s; runtime TTL reduced to 60s for faster cleanup (<a href="https://github.com/cnoe-io/ai-platform-engineering/compare/0.4.5...0.4.6" target="_blank" rel="noopener noreferrer" class="">multiple commits</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>ui</strong>: sync agents tab selection to URL <code>?tab=</code> param — tabs are now linkable and bookmarkable; include agent name in editor card title (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1325" target="_blank" rel="noopener noreferrer" class="">#1325</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.5.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known beyond those noted in 0.4.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.6 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-045--046">Upgrade Guide: 0.4.5 → 0.4.6<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#upgrade-guide-045--046" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.5 → 0.4.6" title="Direct link to Upgrade Guide: 0.4.5 → 0.4.6" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.6 simplifies the dynamic agents runtime (shared clients, lazy provider loading, single-flight init) and improves the setup installer. No Helm values changes and no data migrations are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.5 and 0.4.6. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.6 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.6#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl logs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> deployment/ai-platform-engineering-dynamic-agents </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-i</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime\|init"</span><br></span></code></pre></div></div>
<p>Dynamic agents should start without duplicate initialization log lines.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.7 — Skills Platform Overhaul]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7"/>
        <updated>2026-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-05-05]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-05-05
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.7</code>
Previous release: 0.4.6</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.7 delivers a comprehensive end-to-end overhaul of the Skills platform and a new unsaved-changes guard in the dynamic agent editor. The Skills Workspace is redesigned with a standalone scanner microservice, multi-source hub support, install history, ZIP export, and AI Assist — resolving four pre-existing UX bugs rooted in architectural mismatches.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-platform-overhaul">Skills Platform Overhaul<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#skills-platform-overhaul" class="hash-link" aria-label="Direct link to Skills Platform Overhaul" title="Direct link to Skills Platform Overhaul" translate="no">​</a></h3>
<ul>
<li class=""><strong>Unified Workspace</strong> — skills from all hubs (GitHub, GitLab, local) are browsable in a single view</li>
<li class=""><strong>Standalone scanner microservice</strong> — skill discovery is decoupled from the gateway for reliability and scalability</li>
<li class=""><strong>Installer rewrite</strong> — more robust install flow with per-skill history tracking</li>
<li class=""><strong>Multi-source hubs</strong> — configure multiple GitHub/GitLab skill sources under a single hub</li>
<li class=""><strong>ZIP export</strong> — download skill bundles as ZIP archives</li>
<li class=""><strong>AI Assist</strong> — generate or refine skill content with AI assistance (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1327" target="_blank" rel="noopener noreferrer" class="">#1327</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agent-editor">Dynamic Agent Editor<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#dynamic-agent-editor" class="hash-link" aria-label="Direct link to Dynamic Agent Editor" title="Direct link to Dynamic Agent Editor" translate="no">​</a></h3>
<ul>
<li class=""><strong>Unsaved-changes guard</strong> — confirm dialog shown before navigating away from a dirty agent editor; guards back-button, tab switches, and top-level header links (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1328" target="_blank" rel="noopener noreferrer" class="">#1328</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.6.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known beyond those noted in 0.4.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.7 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-046--047">Upgrade Guide: 0.4.6 → 0.4.7<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#upgrade-guide-046--047" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.6 → 0.4.7" title="Direct link to Upgrade Guide: 0.4.6 → 0.4.7" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.7 overhauled the Skills platform (new scanner microservice, multi-source hubs, ZIP export, AI Assist) and added an unsaved-changes guard to the agent editor. No Helm values changes are required. The Skills scanner runs as a new internal service — no extra configuration is needed for default deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.6 and 0.4.7. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.7 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.7#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>The admin Skills page should show the new Workspace view with unified multi-hub browsing and the Live Crawl console.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.5 — DocumentDB Compatibility Fix]]></title>
        <id>https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5</id>
        <link href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Released: 2026-04-29]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Released: 2026-04-29
Chart: <code>oci://ghcr.io/cnoe-io/charts/ai-platform-engineering:0.4.5</code>
Previous release: 0.4.4</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.5 is a focused bug-fix release. The most impactful change is a DocumentDB/CosmosDB compatibility fix that removes <code>$facet</code> aggregation from conversation list and audit log routes — operators running CAIPE against Amazon DocumentDB or Azure CosmosDB will see these admin views work correctly for the first time. RAG server JavaScript rendering is also repaired on x86_64.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>rag-server</strong>: install <code>chromium_headless_shell</code> in <code>Dockerfile.ingestors</code> (x86_64); add init container chart support — fixes JS rendering failures introduced in the 0.4.4 image (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1320" target="_blank" rel="noopener noreferrer" class="">#1320</a>)</li>
<li class=""><strong>ui</strong>: remove <code>$facet</code> aggregation from conversations and audit log APIs for CosmosDB/DocumentDB compatibility; add <code>client_type=webui</code> default filter so Slack conversations no longer appear in web UI sidebar (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1321" target="_blank" rel="noopener noreferrer" class="">#1321</a>)</li>
<li class=""><strong>ui</strong>: fix dynamic agent chat <code>/skills</code> slash command not loading hub-sourced skills — now uses the unified <code>/api/skills</code> catalog endpoint (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1314" target="_blank" rel="noopener noreferrer" class="">#1314</a>)</li>
<li class=""><strong>slack-bot</strong>: fix only the first matched agent firing for a mention; wire <code>overthink_config</code> so agents with <code>overthink: enabled: true</code> correctly gate on <code>@mentions</code> (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1315" target="_blank" rel="noopener noreferrer" class="">#1315</a>)</li>
<li class=""><strong>docs</strong>: fix broken link in 0.3.x-to-0.4.0 migration guide (<a href="https://github.com/cnoe-io/ai-platform-engineering/pull/1316" target="_blank" rel="noopener noreferrer" class="">#1316</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>No breaking changes. Drop-in upgrade from 0.4.4.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known Issues<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p>None known beyond those noted in 0.4.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.5 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-guide-044--045">Upgrade Guide: 0.4.4 → 0.4.5<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#upgrade-guide-044--045" class="hash-link" aria-label="Direct link to Upgrade Guide: 0.4.4 → 0.4.5" title="Direct link to Upgrade Guide: 0.4.4 → 0.4.5" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>0.4.5 is a bug-fix release focused on DocumentDB/CosmosDB compatibility and RAG server repairs. No Helm values changes and no data migrations are required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-values-changes">Helm Values Changes<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#helm-values-changes" class="hash-link" aria-label="Direct link to Helm Values Changes" title="Direct link to Helm Values Changes" translate="no">​</a></h2>
<p>No Helm values changes between 0.4.4 and 0.4.5. Drop-in upgrade — no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data Migrations<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#data-migrations" class="hash-link" aria-label="Direct link to Data Migrations" title="Direct link to Data Migrations" translate="no">​</a></h2>
<p>No MongoDB schema or data migrations required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notes-for-documentdb--cosmosdb-operators">Notes for DocumentDB / CosmosDB Operators<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#notes-for-documentdb--cosmosdb-operators" class="hash-link" aria-label="Direct link to Notes for DocumentDB / CosmosDB Operators" title="Direct link to Notes for DocumentDB / CosmosDB Operators" translate="no">​</a></h2>
<p>The <code>$facet</code> aggregation stage has been removed from the conversation list and audit log APIs. If you were seeing <code>MongoServerError: Aggregation 'facet' is not supported</code> errors on the admin Conversations or Audit Logs pages, this release resolves them without any configuration changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-runbook">Upgrade Runbook<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#upgrade-runbook" class="hash-link" aria-label="Direct link to Upgrade Runbook" title="Direct link to Upgrade Runbook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-update-chart-version">1. Update chart version<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#1-update-chart-version" class="hash-link" aria-label="Direct link to 1. Update chart version" title="Direct link to 1. Update chart version" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  oci://ghcr.io/cnoe-io/charts/ai-platform-engineering </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token plain">.5 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> your-values.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-verify">2. Verify<a href="https://cnoe-io.github.io/ai-platform-engineering/blog/releases/release-0.4.5#2-verify" class="hash-link" aria-label="Direct link to 2. Verify" title="Direct link to 2. Verify" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>Verify admin Conversations and Audit Logs pages load without errors on DocumentDB/CosmosDB deployments.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
</feed>