<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://caipe.io/releases</id>
    <title>CAIPE Blog</title>
    <updated>2026-08-21T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://caipe.io/releases"/>
    <subtitle>CAIPE Blog</subtitle>
    <icon>https://caipe.io/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Release 0.6.0: New UI and Knowledge Base Access Control]]></title>
        <id>https://caipe.io/releases/release-0.6.0</id>
        <link href="https://caipe.io/releases/release-0.6.0"/>
        <updated>2026-08-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://caipe.io/releases/release-0.6.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p><strong>A new UI.</strong> Navigation and settings were unified into a single application shell: one
settings center instead of scattered per-area config, a coherent workspace nav, and
consistent breadcrumbs, deep links, and pickers throughout. Most screens you touch daily
have moved or been rebuilt.</p>
<p><strong>Knowledge base access control.</strong> RAG knowledge bases are now fully governed. Ingestion
sources are managed from the UI instead of YAML, gated by their own RBAC relations, and
authorization is enforced at <em>query time</em> on the live agent tool path, so a search only
ever sees datasources the caller can read.</p>
<p>Underneath both: the legacy supervisor and standalone A2A agents are gone, and the
Centralized Authorization Service is now the single decision point for every resource.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://caipe.io/releases/release-0.6.0#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-new-application-ui">A new application UI<a href="https://caipe.io/releases/release-0.6.0#a-new-application-ui" class="hash-link" aria-label="Direct link to A new application UI" title="Direct link to A new application UI" translate="no">​</a></h3>
<ul>
<li class=""><strong>Unified settings center</strong>: one place for personal and platform settings, replacing
config spread across separate admin areas.</li>
<li class=""><strong>Unified workspace navigation</strong>: the workspace and settings shells share one navigation
model, with dynamic nav overflow and a compact right-hand cluster.</li>
<li class=""><strong>Consistent wayfinding</strong>: breadcrumbs (including workflows), admin filter deep links,
and admin sub-tab state synced to the URL, so any view can be linked and restored.</li>
<li class="">Animated header brand, navigation, and shared tab selectors; the sidebar no longer
flashes on collapse.</li>
<li class="">Searchable team pickers, expandable config-driven agent panels, editable chat titles, and
ephemeral file previews in agents and workflows.</li>
<li class="">Release notes moved to a user-scoped view under General.</li>
<li class="">The documentation site moved to the <code>caipe.io</code> root and is now responsive with a mobile
navigation menu.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="knowledge-base-access-control">Knowledge base access control<a href="https://caipe.io/releases/release-0.6.0#knowledge-base-access-control" class="hash-link" aria-label="Direct link to Knowledge base access control" title="Direct link to Knowledge base access control" translate="no">​</a></h3>
<ul>
<li class=""><strong>Ingestion sources in the UI</strong>: create, edit, and manage RAG ingestion source configs
(Slack, Confluence, Jira, web URL, Webex) without editing YAML, gated by
<code>ingestion_source</code> RBAC relations. The standalone tab was later folded into Data Sources.</li>
<li class=""><strong>Query-time RBAC on the live agent path</strong>: search, fetch, jobs, and docs are scoped to
the caller's accessible datasources, with an org-admin bypass.</li>
<li class=""><strong>Agent to datasource binding</strong>: an agent's search tool can be pinned to a subset of its
owning team's visible datasources, intersected with the caller's access at runtime.</li>
<li class=""><strong>Ingestor service accounts</strong>: ingestor pods authenticate as recognized service accounts
(<code>RAG_INGESTOR_SERVICE_ACCOUNTS</code>), list only their allowed source types, and report status
through a scoped <code>PATCH</code> endpoint, with no per-resource grants or general write access.</li>
<li class=""><strong>Adopt config-driven sources</strong>: an admin action migrates Helm/YAML-seeded ingestion
sources into the database as permanent, team-owned records.</li>
<li class=""><strong>OpenFGA is the source of truth for KB grants</strong>: <code>team_kb_ownership</code> dropped; knowledge
bases are shared with teams through an OpenFGA reconciler.</li>
<li class="">Public datasources, org-level ingest and search capabilities with an FGA coverage
guarantee, per-tab authorization gates and empty states in the Knowledge sidebar, and the
Graph tab gated on any readable KB.</li>
<li class="">New ingestors: S3 documents and local file upload. Opt-in bypass for SSRF protection on
web ingestion.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="authorization">Authorization<a href="https://caipe.io/releases/release-0.6.0#authorization" class="hash-link" aria-label="Direct link to Authorization" title="Direct link to Authorization" translate="no">​</a></h3>
<ul>
<li class=""><strong>Centralized Authorization Service (CAS)</strong>: core, HTTP API, and admin UI. Every
permission check for agents, workflows, knowledge bases, and MCP tools flows through one
service.</li>
<li class=""><strong>Service accounts</strong>: team-owned bot identities with caller-keyed tool authorization and
credential passthrough.</li>
<li class=""><strong>Access explorer and RBAC self-check</strong> to diagnose why a principal can or cannot reach a
resource; policy manifest downloads.</li>
<li class="">OpenFGA made the source of truth for team resource access, with a decluttered team UI and
split Agents/MCPs tabs.</li>
<li class="">Archived teams grant no access, with self-check repair. Unified ownership transfer across
agents, knowledge bases, and MCP tools.</li>
<li class=""><strong>Okta and LDAP directory sync</strong>: SDK-based sync with JIT provisioning, an IdP-sync admin
UI, a background sync scheduler, per-stage progress logging, user/team upserts, and
<code>OIDC_GROUP_INCLUDELIST</code> / <code>OIDC_GROUP_EXCLUDELIST</code> for AD group filtering.</li>
<li class="">Non-admin scoping for admin teams, users, stats, and feedback; admin insights scoped to
owned agents with an agent filter.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="retiring-the-legacy-runtime">Retiring the legacy runtime<a href="https://caipe.io/releases/release-0.6.0#retiring-the-legacy-runtime" class="hash-link" aria-label="Direct link to Retiring the legacy runtime" title="Direct link to Retiring the legacy runtime" translate="no">​</a></h3>
<ul>
<li class=""><strong>The legacy supervisor model and standalone A2A agents are removed.</strong> Dynamic agents are
the only routing layer.</li>
<li class="">A <code>legacy_runtime_cleanup_v1</code> migration drops orphaned checkpoint collections and unsets
<code>metadata.agent_version</code> / <code>metadata.model_used</code> on conversations and <code>a2a_events</code> on
messages. See <a href="https://caipe.io/releases/release-0.6.0#upgrade" class="">Upgrade</a>; it is destructive and optional.</li>
<li class="">Admin Insights, Metrics, and Health were rebuilt on dynamic-agent telemetry
(<code>da_turns_total</code>, <code>da_turn_duration_seconds</code>, <code>da_llm_calls_total</code>, <code>da_tool_calls_total</code>,
<code>da_active_requests</code>). Chat now persists <code>agent_name</code> and a measured <code>latency_ms</code>, so Top
Agents and response-time charts populate.</li>
<li class="">The Autonomous UI was restored on the dynamic-agents architecture.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scheduled-agents">Scheduled agents<a href="https://caipe.io/releases/release-0.6.0#scheduled-agents" class="hash-link" aria-label="Direct link to Scheduled agents" title="Direct link to Scheduled agents" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>mcp-scheduler</code></strong> exposes create, list, update, and delete for scheduled jobs, each
owned by its creator.</li>
<li class="">Kubernetes CronJob backend; the <code>caipe-cron-runner</code> pod fires once per interval and exits.</li>
<li class="">The JWT is relayed to the scheduler service, which validates it and derives <code>owner_sub</code>,
so enforcement matches an interactive run. Admins can change the default schedule-editor
agent from the UI.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multimodal-chat">Multimodal chat<a href="https://caipe.io/releases/release-0.6.0#multimodal-chat" class="hash-link" aria-label="Direct link to Multimodal chat" title="Direct link to Multimodal chat" translate="no">​</a></h3>
<ul>
<li class="">Attach files to chat messages as multimodal model input, shown inline in the transcript.</li>
<li class="">Slack attachments forwarded as multimodal input.</li>
<li class="">Per-model input capabilities declared up front, degrading cleanly and naming the model in
the skip warning; input attachments capped.</li>
<li class="">Attachment bytes offloaded to object storage, with a dropped-input-files panel in metrics
and a multimodal regression harness.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-operations">Platform operations<a href="https://caipe.io/releases/release-0.6.0#platform-operations" class="hash-link" aria-label="Direct link to Platform operations" title="Direct link to Platform operations" translate="no">​</a></h3>
<ul>
<li class=""><strong>Audit service</strong>: a lightweight runtime plus a read UI, S3 retention controls, storage
usage visibility, configurable verbosity, and connector diagnostics.</li>
<li class=""><strong>Platform health</strong>: probes refactored to capabilities with profile-aware integration
status, a dynamic-agents probe, and a steady-state operations dashboard.</li>
<li class=""><strong>Remote MCP catalog</strong> with OAuth credential connectors; MCP servers default to streamable
HTTP; <code>mcpSecrets</code> added as the canonical name for <code>agentSecrets</code>.</li>
<li class=""><strong>Keycloak</strong>: configurable SSO session lifetime (7 day idle, 14 day max), PostgreSQL
support, a <code>caipe-cli</code> public client for local dev tokens, and migration health surfaces.</li>
<li class="">Object storage resolved from a shared <code>global.storage.s3</code> block.</li>
<li class="">Multiple Webex bots with 1:1 support, per-surface default agents, and a Webex Meetings MCP
server.</li>
<li class="">CI moved to native per-architecture image builds; third-party MCP images pinned.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixes">Fixes<a href="https://caipe.io/releases/release-0.6.0#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<p>Roughly a thousand commits between 0.5.0 and 0.6.0 went to reliability. The concentrations:</p>
<ul>
<li class=""><strong>UI and admin</strong>: the largest single group, tracking the navigation rework and the
screens rebuilt around it.</li>
<li class=""><strong>Authorization</strong>: grant correctness, team membership performance, OpenFGA batch-check
limits, stale principal cleanup, and service-account grant preservation across visibility
changes.</li>
<li class=""><strong>Identity</strong>: Okta sync throttling and reliability, auto-create team sync, Keycloak 26.x
robustness and upgrade reconciliation, federated identity, and the SSO idle-timeout fix.</li>
<li class=""><strong>Chat and dynamic agents</strong>: deprecated-agent recovery, private chat access, subagent
HITL resume, tool result invariants, immutable prompt rendering, and failed conversation
deletes no longer reappearing.</li>
<li class=""><strong>Slack and Webex</strong>: file-attachment routing, agent pagination, name parsing, ephemeral
nudges, Workflow Builder mentions, and space navigation.</li>
<li class=""><strong>Security</strong>: SSRF protections in web ingestors, NoSQL injection fixes in the admin API,
catalog credential boundaries, skills zip import ownership, and dependency vulnerability
sweeps.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://caipe.io/releases/release-0.6.0#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 Helm values changes in 0.6.0 itself. Ten changes landed between 0.5.0 and
0.6.0 that need review:</p>
<table><thead><tr><th>Version</th><th>Change</th><th>Who is affected</th></tr></thead><tbody><tr><td>0.5.3</td><td>AgentGateway routing defaults to <code>static</code> (CRD-free)</td><td>Set <code>global.agentgateway.routingMode: gateway-api</code> if you rely on Gateway API CRs</td></tr><tr><td>0.5.8</td><td>Catalog API key digests moved from SHA-256 to HMAC-SHA256</td><td>Keys minted before 0.5.8 fail verification, so re-mint them</td></tr><tr><td>0.5.10</td><td>Slack slash-command prefix follows <code>APP_NAME</code></td><td>Only if automations hardcode <code>/caipe</code> and you changed <code>APP_NAME</code></td></tr><tr><td>0.5.17</td><td>NPS survey and Admin → NPS tab removed</td><td><code>nps.enabled</code> is ignored; drop it from values</td></tr><tr><td>0.5.22</td><td>Legacy supervisor and standalone A2A agents removed</td><td>Drop <code>supervisor.*</code> / <code>a2a-agents.*</code> values</td></tr><tr><td>0.5.24</td><td><code>agentSecrets</code> deprecated in favour of <code>mcpSecrets</code></td><td>Still functional; migrate for forward compatibility</td></tr><tr><td>0.5.49</td><td>New channel onboardings default to mention-only</td><td>Existing channels unaffected; set <code>listen: "all"</code> to opt out</td></tr><tr><td>0.5.55</td><td>Webex bot defaults move from env vars to a structured <code>bots</code> array</td><td>Only <code>tags.webex-bot: true</code> deployments</td></tr><tr><td>0.5.62</td><td><code>agentgateway.authz.restrictedMcpServers</code> defaults to <code>[]</code></td><td>Re-add entries if you deliberately restricted a server</td></tr><tr><td>0.6.0</td><td>The <strong>Tokens Used</strong> metric is gone from Insights, <code>/api/users/me/insights</code>, and <code>/api/users/me/stats</code></td><td>Anything scraping those responses for a token count</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://caipe.io/releases/release-0.6.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/caipe-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.6</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>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="values-keys-to-drop">Values keys to drop<a href="https://caipe.io/releases/release-0.6.0#values-keys-to-drop" class="hash-link" aria-label="Direct link to Values keys to drop" title="Direct link to Values keys to drop" translate="no">​</a></h3>
<p>These are no-ops and can be removed:</p>
<ul>
<li class="">any <code>supervisor.*</code> config and <code>a2a-agents.*</code> standalone agent entries</li>
<li class=""><code>nps.enabled</code></li>
<li class=""><code>AGENT_GATEWAY_MCP_SERVER_IDS</code>, since AgentGateway routes by profile now</li>
</ul>
<p>If you run the Webex bot, restructure its defaults into the <code>bots</code> array (0.5.55). If you
deliberately restricted an MCP server, re-add it to <code>restrictedMcpServers</code> (0.5.62).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data migrations<a href="https://caipe.io/releases/release-0.6.0#data-migrations" class="hash-link" aria-label="Direct link to Data migrations" title="Direct link to Data migrations" translate="no">​</a></h3>
<p>Two admin-run migrations apply, under <strong>Admin → Migrations</strong>:</p>
<ul>
<li class=""><strong><code>0.5.8</code></strong>: catalog API key rehash. Required if you use catalog API keys; clients need
newly minted keys afterwards.</li>
<li class=""><strong><code>0.6.0</code></strong>: legacy runtime cleanup. <strong>Destructive and optional.</strong> It preserves
<code>checkpoints_conversation</code> and <code>workflow_checkpoints</code> (with their writes collections) and
drops every other <code>checkpoints_*</code> / <code>checkpoint_writes_*</code> collection, which are orphans
from the supervisor era with no reader left. It also unsets <code>metadata.agent_version</code> and
<code>metadata.model_used</code> on conversations and <code>a2a_events</code> on messages.</li>
</ul>
<p>Nothing in 0.6.0 reads the data the <code>0.6.0</code> migration removes, so the upgrade is safe
without running it. Run it when you want the storage back, and take a MongoDB backup first,
because it is not reversible.</p>
<p>Enabling RBAC for the first time bootstraps the OpenFGA authorization model and backfills
tuples on first run.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify">Verify<a href="https://caipe.io/releases/release-0.6.0#verify" class="hash-link" aria-label="Direct link to Verify" title="Direct link to 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"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Send a test chat message, then check Admin → Insights shows the agent name and latency</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <author>
            <name>Kevin Kantesaria</name>
            <uri>https://github.com/kevkantes</uri>
        </author>
        <author>
            <name>Erik Lutz</name>
            <uri>https://github.com/cisco-erilutz</uri>
        </author>
        <author>
            <name>Shubham Bakshi</name>
            <uri>https://github.com/subbaksh</uri>
        </author>
        <author>
            <name>Sunny Whang</name>
            <uri>https://github.com/suwhang-cisco</uri>
        </author>
        <author>
            <name>David Bouchare</name>
            <uri>https://github.com/dabcoder</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.5.0: Enterprise Authorization and the Workflow Engine]]></title>
        <id>https://caipe.io/releases/release-0.5.0</id>
        <link href="https://caipe.io/releases/release-0.5.0"/>
        <updated>2026-05-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://caipe.io/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><strong>Enterprise authorization.</strong> A full cutover from role-based 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.</p>
<p><strong>A workflow engine.</strong> Multi-step agentic workflows with a visual editor, human-in-the-loop
approval, artifact capture, and sharing.</p>
<p>Alongside those: a new Webex bot, an envelope-encrypted credential store with an OAuth
connector platform, and a rebuilt Skills platform.</p>
<p>The entire authorization stack is <strong>opt-in and disabled by default</strong>: for a stock 0.4.x
deployment this is a drop-in upgrade with no <code>values.yaml</code> edits required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://caipe.io/releases/release-0.5.0#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="identity-and-authorization-openfga-rebac">Identity and authorization (OpenFGA ReBAC)<a href="https://caipe.io/releases/release-0.5.0#identity-and-authorization-openfga-rebac" class="hash-link" aria-label="Direct link to Identity and authorization (OpenFGA ReBAC)" title="Direct link to Identity and authorization (OpenFGA ReBAC)" translate="no">​</a></h3>
<ul>
<li class=""><strong>ReBAC core, admin BFF, and admin UI</strong>: a 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 surface, and admin UI for
teams and authorization.</li>
<li class=""><strong>Auth foundation charts</strong>: new <code>keycloak</code>, <code>openfga</code>, <code>openfga-authz-bridge</code>, and
<code>agentgateway</code> subcharts, with Keycloak realm init, token-exchange and auth-reconcile
jobs, the OpenFGA model bootstrap, and the Python ext_authz bridge.</li>
<li class=""><strong>Shared MCP agent-auth library</strong>: a 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>.</li>
<li class=""><strong>RAG ReBAC with per-document ACLs</strong>: OpenFGA 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.</li>
<li class=""><strong><code>admin</code> implies <code>member</code></strong> plus an auto-provisioned Super Admins team, removing the
need to dual-write tuples.</li>
<li class=""><strong>Channel-derived team binding</strong>: the authorizing team is derived from the Slack
channel, Webex space, or DM context, which is correct for multi-team users by
construction. Personal DM commands added to both bots.</li>
<li class="">Persisted onboarding defaults in <code>platform_config</code>, and an admin-configurable discovery
cache TTL.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-engine">Workflow engine<a href="https://caipe.io/releases/release-0.5.0#workflow-engine" class="hash-link" aria-label="Direct link to Workflow engine" title="Direct link to Workflow engine" translate="no">​</a></h3>
<ul>
<li class=""><strong>Server-side workflow infrastructure</strong>, API routes, stores, and types.</li>
<li class=""><strong>ReactFlow-based visual editor</strong> with skill isolation.</li>
<li class=""><strong>Human-in-the-loop</strong>: <code>waiting_for_input</code> run cards with approval forms, hidden on
terminal runs; a <code>cancelled</code> status.</li>
<li class=""><strong>Step context injection, artifact capture</strong>, and warnings for unavailable resources.</li>
<li class=""><strong>Config-driven seeding</strong> with read-only protection and a banner in the UI.</li>
<li class=""><strong>Visibility and sharing RBAC</strong> with config-access checks on runs.</li>
<li class=""><strong>Step-level tool restrictions</strong> via a Tool Access picker.</li>
<li class="">YAML export/import (switched from JSON), run deletion with file cleanup, and auto-expiry.</li>
<li class="">Workflow tools for dynamic agents, with run cards and trigger info.</li>
<li class="">Gated behind <code>WORKFLOWS_ENABLED</code>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bots-webex-and-slack">Bots: Webex and Slack<a href="https://caipe.io/releases/release-0.5.0#bots-webex-and-slack" class="hash-link" aria-label="Direct link to Bots: Webex and Slack" title="Direct link to Bots: Webex and Slack" translate="no">​</a></h3>
<ul>
<li class=""><strong>New Webex bot integration</strong>: a full <code>webex_bot</code> integration (A2A client, app, identity
linking, audit, hardening, Prometheus metrics) plus a <code>webex-bot</code> subchart, Dockerfile,
and CI workflow.</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.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="credentials">Credentials<a href="https://caipe.io/releases/release-0.5.0#credentials" class="hash-link" aria-label="Direct link to Credentials" title="Direct link to Credentials" translate="no">​</a></h3>
<ul>
<li class=""><strong>Envelope-encrypted credential store</strong>: MongoDB-backed 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 <code>CAIPE_CREDENTIALS_ENABLED</code> and disabled by default.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-platform">Skills platform<a href="https://caipe.io/releases/release-0.5.0#skills-platform" class="hash-link" aria-label="Direct link to Skills platform" title="Direct link to Skills platform" translate="no">​</a></h3>
<ul>
<li class=""><strong>Unified Workspace</strong> browsing every hub (GitHub, GitLab, local) in one view.</li>
<li class=""><strong>Standalone scanner microservice</strong>, decoupled from the gateway for reliability.</li>
<li class="">Installer rewrite with per-skill install history, multi-source hubs, ZIP export, and AI
Assist for authoring.</li>
<li class="">Skills Builder for dynamic agents, gallery filter/sort controls, and a
<code>HIDE_BUILTIN_SKILLS</code> flag.</li>
<li class=""><strong>AI Review module</strong> for skills and dynamic agents, with a reworked rubric.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents-and-chat">Dynamic agents and chat<a href="https://caipe.io/releases/release-0.5.0#dynamic-agents-and-chat" class="hash-link" aria-label="Direct link to Dynamic agents and chat" title="Direct link to Dynamic agents and chat" translate="no">​</a></h3>
<ul>
<li class=""><strong>HITL tool approval</strong>: agents pause for explicit human approval before running a
sensitive tool, with GridFS-backed storage for large artifacts.</li>
<li class="">JWT/OBO auth plus an OpenFGA PDP gate, bringing the runtime to parity with the rest of
the auth surface.</li>
<li class=""><strong>MCP endpoint normalizer and self-heal</strong>: canonicalizes MCP URLs from bot configs
(trailing slash, <code>/mcp</code> suffix, scheme inference), forwards request tokens via OBO, and
resolves credential references.</li>
<li class="">A <code>curl</code> builtin tool for PUT/POST and an <code>allow_non_public_urls</code> option for private
endpoints.</li>
<li class="">A generic files API, a resizable context panel, editor blocker hints, and protection for
the platform default agent.</li>
<li class=""><code>get_file_line_count</code>, which the agent is prompted to call before <code>read_file</code> so large
files are read in bounded ranges.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrations-and-mcp">Integrations and MCP<a href="https://caipe.io/releases/release-0.5.0#integrations-and-mcp" class="hash-link" aria-label="Direct link to Integrations and MCP" title="Direct link to Integrations and MCP" translate="no">​</a></h3>
<ul>
<li class=""><strong>AWS MCP server</strong> and a Pod Security Standards baseline.</li>
<li class=""><strong>LiteLLM FinOps MCP server</strong> for model cost and usage reporting, with theme-aware
report images.</li>
<li class="">VictorOps consolidated onto v2 incident reporting; Jira internal service-desk comments.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="operations">Operations<a href="https://caipe.io/releases/release-0.5.0#operations" class="hash-link" aria-label="Direct link to Operations" title="Direct link to Operations" translate="no">​</a></h3>
<ul>
<li class=""><strong>DocumentDB compatibility</strong>: the runtime works against AWS DocumentDB, not just vanilla
MongoDB.</li>
<li class="">Installer UX and runtime simplification; the embeddings menu in <code>setup-caipe.sh</code> expanded
to all seven <code>EmbeddingsFactory</code> providers including Bedrock, Cohere, and Voyage AI.</li>
<li class="">Documentation site redesign, and versioned docs generated at build time from release tags.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixes">Fixes<a href="https://caipe.io/releases/release-0.5.0#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>Slack and chat reliability</strong>: followup prompts no longer claim knowledge of replies the
agent never made; stale env-provided Slack default agent/team are dropped with a warning
rather than silently honored; channel discovery uses <code>users.conversations</code> to dodge Slack
API rate limits.</li>
<li class=""><strong>RAG truncation and seed persistence</strong>: long retrieved documents are no longer silently
cut, and seeded config survives restarts.</li>
<li class=""><strong>Web ingestion</strong>: fixed crawling after the Scrapy 2.16 bump.</li>
<li class=""><strong>Dynamic agent chat regression</strong>: restored chat for agents created through the UI editor.</li>
<li class=""><strong>RBAC</strong>: scoped team admins can edit, delete, and configure their own team; previously
group admins could not modify anything within their own group.</li>
<li class=""><strong>Charts</strong>: <code>workflow_configs</code> included in the <code>caipe-ui</code> app ConfigMap so self-service
workflows render; the Ollama embedding model is pulled during setup so local embeddings
work out of the box.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://caipe.io/releases/release-0.5.0#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>Keycloak client-secret hardening</strong>: a reconcile pass rotates dev placeholder secrets
for the three confidential service-account clients on every install/upgrade, plus a
strict-mode gate (<code>keycloak.strictClientSecrets</code>, default off) that fails the install if a
known placeholder still mints a token. Five demo users with hardcoded passwords were
removed from the bundled realm config.</li>
<li class=""><strong>BFF <code>admin/admin</code> fallback removed</strong>: production requires the <code>client_credentials</code> path
against a confidential client and fails loudly otherwise. MongoDB and NextAuth strict-mode
gates added.</li>
<li class=""><strong>MongoDB strict-password gate</strong>: <code>mongodb.auth.strictPasswords</code> (default off) makes
install/upgrade fail fast when the root password is left at a placeholder like <code>changeme</code>.</li>
<li class="">Envelope-encrypted credentials; production installs must use <code>aws-kms</code> (<code>local-cmk</code> is for
non-production testing only).</li>
<li class="">Dependency hardening: exact pins for <code>aiohttp</code>, <code>websockets</code>, and <code>@aws-sdk/client-kms</code>;
<code>fastmcp</code> bumped to 3.3.1; stale MCP <code>uv.lock</code> files refreshed; <code>protobuf</code> and <code>qs</code> bumped.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://caipe.io/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> in 0.5.0. Every key in the chart diff is
additive, and the RBAC/OpenFGA/Keycloak/Webex/credentials stack ships disabled by default
(<code>tags.keycloak</code>, <code>tags.webex-bot</code>, <code>openfga.enabled</code>, <code>global.agentgateway.enabled</code>, and
<code>CAIPE_CREDENTIALS_ENABLED</code> all default to <code>false</code>).</p>
<p>Three changes landed between 0.4.0 and 0.5.0 that need attention:</p>
<table><thead><tr><th>Change</th><th>Who is affected</th></tr></thead><tbody><tr><td>Slack <code>botConfig</code> channel schema uses a flat <code>agents</code> list</td><td>Anyone who had not already migrated as part of the 0.4.0 upgrade</td></tr><tr><td><code>overthink.custom_prompt</code> removed from the Slack bot config</td><td>Only deployments that explicitly set it</td></tr><tr><td><code>active_team</code> JWT claim removed, replaced by channel-derived team binding</td><td>Only external code that read the claim; 0.4.x never issued it through this stack</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known issues<a href="https://caipe.io/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 beyond the Slack statistics gap noted in 0.4.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://caipe.io/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/caipe-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>That alone is sufficient for a stock upgrade. The new authorization stack stays disabled.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopting-the-new-stacks">Adopting the new stacks<a href="https://caipe.io/releases/release-0.5.0#adopting-the-new-stacks" class="hash-link" aria-label="Direct link to Adopting the new stacks" title="Direct link to Adopting the new stacks" translate="no">​</a></h3>
<table><thead><tr><th>Step</th><th>What to enable</th><th>Key values</th></tr></thead><tbody><tr><td>1</td><td>RBAC + OpenFGA</td><td><code>tags.keycloak</code>, <code>openfga.enabled</code>, <code>openfgaAuthzBridge.enabled</code>, <code>global.agentgateway.enabled</code></td></tr><tr><td>2</td><td>Webex bot</td><td><code>tags.webex-bot: true</code></td></tr><tr><td>3</td><td>Credentials store</td><td><code>CAIPE_CREDENTIALS_ENABLED: "true"</code>, <code>CREDENTIAL_KEY_PROVIDER: "aws-kms"</code></td></tr><tr><td>4</td><td>Workflows</td><td><code>WORKFLOWS_ENABLED: "true"</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-migrations">Data migrations<a href="https://caipe.io/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></h3>
<ul>
<li class=""><strong>MongoDB</strong>: no destructive schema migration. New collections back the credential store
and Slack/Webex route management; the credential store adds indexes via
<code>scripts/init-credential-mongo-indexes.ts</code>. All are created lazily, and only when the
corresponding feature is enabled.</li>
<li class=""><strong>OpenFGA</strong>: if you enable RBAC, the chart bootstraps the authorization model and creates
the <code>caipe-openfga</code> store. There is no prior store to migrate from.</li>
<li class=""><strong>Keycloak</strong>: the subchart is new. Enabling it initializes the <code>caipe</code> realm, the
token-exchange clients, and optionally the upstream IdP broker.</li>
<li class=""><strong><code>active_team</code> JWT claim</strong>: no data migration; the claim is simply no longer issued.</li>
</ul>
<p>One admin-run migration is registered for this release under <strong>Admin → Migrations</strong>
(<code>0.5.1</code>). Run it if you adopt RBAC.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify">Verify<a href="https://caipe.io/releases/release-0.5.0#verify" class="hash-link" aria-label="Direct link to Verify" title="Direct link to 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"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Send a test chat message and confirm a normal response</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rollback">Rollback<a href="https://caipe.io/releases/release-0.5.0#rollback" class="hash-link" aria-label="Direct link to Rollback" title="Direct link to Rollback" translate="no">​</a></h3>
<p><code>helm rollback ai-platform-engineering &lt;previous-revision&gt;</code> and restore your backed-up
values file. Because every 0.5.0 addition is additive and disabled by default, a stock
rollback needs no data changes.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <author>
            <name>Kevin Kantesaria</name>
            <uri>https://github.com/kevkantes</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release 0.4.0: AG-UI Protocol Unification]]></title>
        <id>https://caipe.io/releases/release-0.4.0</id>
        <link href="https://caipe.io/releases/release-0.4.0"/>
        <updated>2026-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://caipe.io/releases/release-0.4.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>0.4.0 restructures the platform around the <strong>AG-UI protocol</strong> and makes the Next.js
gateway the single front door. Streaming, conversation storage, and authentication stop
being per-client concerns: the web UI, Slack bot, and dynamic agents all speak one event
model and share one conversation API.</p>
<p>Helm values for all three components are restructured. The upgrade guide below has the
complete before/after mapping.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://caipe.io/releases/release-0.4.0#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ag-ui-protocol">AG-UI protocol<a href="https://caipe.io/releases/release-0.4.0#ag-ui-protocol" class="hash-link" aria-label="Direct link to AG-UI protocol" title="Direct link to AG-UI protocol" translate="no">​</a></h3>
<ul>
<li class=""><strong>Unified streaming</strong>: the AG-UI event model replaces legacy A2A streaming across
dynamic agents, the Slack bot, and the UI. Stream events are persisted server-side.</li>
<li class=""><strong>Stream encoder abstraction</strong>: <code>AGUIStreamEncoder</code> and <code>CustomStreamEncoder</code> behind a
<code>StreamEncoder</code> ABC.</li>
<li class=""><strong>Slack bot rewritten on AG-UI</strong>: typing indicators with live thoughts, todo-aware
streaming, and subagent suppression.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nextjs-gateway-architecture">Next.js gateway architecture<a href="https://caipe.io/releases/release-0.4.0#nextjs-gateway-architecture" class="hash-link" aria-label="Direct link to Next.js gateway architecture" title="Direct link to Next.js gateway architecture" translate="no">​</a></h3>
<ul>
<li class=""><strong>All traffic routes through the gateway</strong>: flat <code>/api/v1/chat/</code> routes authenticated
with <code>X-User-Context</code>. Dynamic agents no longer validate tokens or accept direct browser
requests.</li>
<li class="">Config ownership moved from dynamic agents to the UI: agent CRUD, MCP servers, and the
models endpoint now live in local MongoDB.</li>
<li class="">Bearer-token auth for service accounts, which is how the Slack bot authenticates.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared-conversation-api">Shared conversation API<a href="https://caipe.io/releases/release-0.4.0#shared-conversation-api" class="hash-link" aria-label="Direct link to Shared conversation API" title="Direct link to Shared conversation API" translate="no">​</a></h3>
<ul>
<li class="">Server-owned ID generation with an <code>idempotency_key</code> for cross-client dedup.</li>
<li class="">A <code>client_type</code> enum (<code>webui</code> | <code>slack</code>) on every conversation; all ten Slack handlers
migrated.</li>
<li class=""><strong>Delta thread context</strong>: follow-ups embed only messages since <code>last_processed_ts</code>,
eliminating quadratic checkpoint growth on long threads.</li>
<li class=""><code>PATCH /api/chat/conversations/[id]/metadata</code> with MongoDB dot-notation <code>$set</code>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-agents-runtime">Dynamic agents runtime<a href="https://caipe.io/releases/release-0.4.0#dynamic-agents-runtime" class="hash-link" aria-label="Direct link to Dynamic agents runtime" title="Direct link to Dynamic agents runtime" translate="no">​</a></h3>
<ul>
<li class=""><code>ClientContext</code> and Jinja2 system-prompt rendering.</li>
<li class="">New <code>wait</code> and <code>agent_info</code> tools; configurable middlewares.</li>
<li class=""><code>NAMESPACE_CONTEXT</code> emitted only on change, <code>UserContext</code> made opaque, and RBAC removed
from chat routes (the gateway owns it).</li>
<li class="">A metrics endpoint.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ui">UI<a href="https://caipe.io/releases/release-0.4.0#ui" class="hash-link" aria-label="Direct link to UI" title="Direct link to UI" translate="no">​</a></h3>
<ul>
<li class="">Streaming markdown with rAF throttling, block animations, and cursor improvements.</li>
<li class="">Jinja2 syntax highlighting in the system-prompt editor.</li>
<li class="">A turns collection, decoupling <code>stream_events</code> from messages.</li>
<li class="">Admin: platform statistics with Slack integration, unified filters, user detail panels,
and paginated conversations.</li>
<li class="">An LLM model config page for adding and removing models through the UI.</li>
<li class="">A new System theme that follows the OS setting.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixes">Fixes<a href="https://caipe.io/releases/release-0.4.0#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>slack</strong>: add the <code>escalation_policy</code> field to the VictorOps escalation config; stop
the humble-followup prompt from claiming knowledge of a reply the agent never made.</li>
<li class=""><strong>admin</strong>: key feedback dedup on <code>(permalink, user_email)</code> rather than permalink alone,
key the Slack feedback upsert on <code>(message_id, user_id)</code>, and fix top-user linkage.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://caipe.io/releases/release-0.4.0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h2>
<blockquote>
<p>This release contains significant breaking Helm value changes. The upgrade guide below
has the complete before/after mapping.</p>
</blockquote>
<table><thead><tr><th>Change</th><th>Severity</th></tr></thead><tbody><tr><td><code>env:</code> block removed from all components; use the flat <code>config:</code> map</td><td><strong>High</strong></td></tr><tr><td><code>caipe-ui.seedConfig.*</code> → <code>caipe-ui.appConfig.*</code> (<code>SEED_CONFIG_PATH</code> → <code>APP_CONFIG_PATH</code>)</td><td><strong>High</strong></td></tr><tr><td><code>slack-bot</code> values completely restructured to a flat <code>config:</code> map</td><td><strong>High</strong></td></tr><tr><td><code>slack-bot.slack.tokenSecretRef</code> → <code>slack-bot.existingSecret</code></td><td><strong>High</strong></td></tr><tr><td><code>slack-bot</code> <code>botConfig</code> channels: <code>qanda</code>/<code>ai_alerts</code>/<code>ai_enabled</code> → flat <code>agents</code> list</td><td><strong>High</strong></td></tr><tr><td><code>dynamic-agents</code> OIDC/CORS keys removed; auth is handled by the gateway</td><td><strong>High</strong></td></tr><tr><td><code>dynamic-agents.config.AUTH_ENABLED</code> → <code>DEBUG: "true"</code> for the dev bypass</td><td>Medium</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issues">Known issues<a href="https://caipe.io/releases/release-0.4.0#known-issues" class="hash-link" aria-label="Direct link to Known issues" title="Direct link to Known issues" translate="no">​</a></h2>
<p>The Admin Statistics page under-reports Slack conversation counts until an
<code>InteractionTracker</code> equivalent is re-implemented in the new AG-UI Slack bot.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade">Upgrade<a href="https://caipe.io/releases/release-0.4.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/caipe-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">.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-03x--040">Upgrade guide: 0.3.x → 0.4.0<a href="https://caipe.io/releases/release-0.4.0#upgrade-guide-03x--040" class="hash-link" aria-label="Direct link to Upgrade guide: 0.3.x → 0.4.0" title="Direct link to Upgrade guide: 0.3.x → 0.4.0" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-caipe-ui">1. CAIPE UI<a href="https://caipe.io/releases/release-0.4.0#1-caipe-ui" class="hash-link" aria-label="Direct link to 1. CAIPE UI" title="Direct link to 1. CAIPE UI" translate="no">​</a></h3>
<p><strong>Merge <code>env:</code> into <code>config:</code>.</strong> All environment variables live in one flat map.</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 comment" style="color:rgb(98, 114, 164)"># Before (0.3.x)</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-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">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">SKILLS_DIR</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)">"/app/data/skills"</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">SSO_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" 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)"># After (0.4.0)</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-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">SKILLS_DIR</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)">"/app/data/skills"</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">SSO_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>
<p><strong>Rename <code>seedConfig:</code> to <code>appConfig:</code></strong> and drop <code>enabled:</code>. The ConfigMap is created
automatically when any of <code>models</code>, <code>mcp_servers</code>, or <code>agents</code> is non-empty. The chart
swaps <code>SEED_CONFIG_PATH</code> for <code>APP_CONFIG_PATH</code> on your behalf.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-dynamic-agents">2. Dynamic agents<a href="https://caipe.io/releases/release-0.4.0#2-dynamic-agents" class="hash-link" aria-label="Direct link to 2. Dynamic agents" title="Direct link to 2. Dynamic agents" translate="no">​</a></h3>
<ul>
<li class="">Merge <code>env:</code> into <code>config:</code>, then delete the <code>env:</code> block.</li>
<li class="">Remove <code>AUTH_ENABLED</code>. For a local dev bypass use <code>DEBUG: "true"</code>; in production omit it.</li>
<li class="">Remove <code>OIDC_ISSUER</code>, <code>OIDC_CLIENT_ID</code>, <code>OIDC_REQUIRED_ADMIN_GROUP</code>, and
<code>CORS_ORIGINS</code>. These belong to <code>caipe-ui</code> now, because dynamic agents never see a
browser request.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-slack-bot-the-bulk-of-the-work">3. Slack bot, the bulk of the work<a href="https://caipe.io/releases/release-0.4.0#3-slack-bot-the-bulk-of-the-work" class="hash-link" aria-label="Direct link to 3. Slack bot, the bulk of the work" title="Direct link to 3. Slack bot, the bulk of the work" translate="no">​</a></h3>
<p>Named keys are replaced by a flat <code>config:</code> map plus a top-level <code>existingSecret:</code>.</p>
<table><thead><tr><th>Old key (0.3.x)</th><th>New key in <code>config:</code></th></tr></thead><tbody><tr><td><code>appName</code></td><td><code>APP_NAME</code></td></tr><tr><td><code>botMode</code></td><td><code>SLACK_BOT_MODE</code></td></tr><tr><td><code>caipeApiUrl</code></td><td><code>CAIPE_API_URL</code></td></tr><tr><td><code>silenceEnv</code></td><td><code>SLACK_INTEGRATION_SILENCE_ENV</code></td></tr><tr><td><code>slackWorkspaceUrl</code></td><td><code>SLACK_WORKSPACE_URL</code></td></tr><tr><td><code>env.*</code></td><td>move into <code>config:</code></td></tr><tr><td><code>mongodb.uri</code></td><td><code>MONGODB_URI</code> (consider a Secret instead)</td></tr><tr><td><code>mongodb.database</code></td><td><code>MONGODB_DATABASE</code></td></tr><tr><td><code>auth.enabled</code></td><td><code>SLACK_INTEGRATION_ENABLE_AUTH</code></td></tr><tr><td><code>auth.tokenUrl</code></td><td><code>OAUTH2_TOKEN_URL</code></td></tr><tr><td><code>auth.clientId</code></td><td><code>OAUTH2_CLIENT_ID</code></td></tr><tr><td><code>auth.scope</code></td><td><code>OAUTH2_SCOPE</code> (omit if empty)</td></tr><tr><td><code>auth.audience</code></td><td><code>OAUTH2_AUDIENCE</code> (omit if empty)</td></tr><tr><td><code>prompts.responseStyle</code></td><td><code>SLACK_INTEGRATION_PROMPT_RESPONSE_STYLE</code></td></tr><tr><td><code>prompts.qanda</code></td><td><code>SLACK_INTEGRATION_PROMPT_QANDA</code></td></tr><tr><td><code>prompts.overthinkQanda</code></td><td><code>SLACK_INTEGRATION_PROMPT_OVERTHINK_QANDA</code></td></tr><tr><td><code>prompts.mention</code></td><td><code>SLACK_INTEGRATION_PROMPT_MENTION</code></td></tr><tr><td><code>prompts.humbleFollowup</code></td><td><code>SLACK_INTEGRATION_PROMPT_HUMBLE_FOLLOWUP</code></td></tr><tr><td><code>prompts.aiAlerts</code></td><td><code>SLACK_INTEGRATION_PROMPT_AI_ALERTS</code></td></tr><tr><td><code>slack.tokenSecretRef</code></td><td><code>existingSecret</code> (top level, same Secret)</td></tr></tbody></table>
<p>The Secret contents do not change: <code>SLACK_BOT_TOKEN</code>, <code>SLACK_APP_TOKEN</code>,
<code>SLACK_SIGNING_SECRET</code>, and optionally <code>OAUTH2_CLIENT_SECRET</code>.</p>
<p><strong>Bot config file moved.</strong> <code>CAIPE_BOT_CONFIG</code> → <code>SLACK_INTEGRATION_BOT_CONFIG</code> (set by
the chart), and <code>/etc/caipe/caipe-bot-config.yaml</code> → <code>/etc/caipe/bot-config.yaml</code> in a
dedicated <code>*-bot-config</code> ConfigMap. If neither is present the bot starts with no channel
configuration and logs a warning rather than crashing.</p>
<p><strong><code>botConfig</code> channels use a flat <code>agents</code> list.</strong> The bot rejects the old keys with an
explicit error.</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 comment" style="color:rgb(98, 114, 164)"># Before</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">botConfig</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">C012345678</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">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)">"#example-channel"</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">ai_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">qanda</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">include_bots</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><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">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 punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token key atrule">bot_list</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"example-bot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</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 key atrule">ai_alerts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><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">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</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" 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)"># After</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">botConfig</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">C012345678</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">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)">"#example-channel"</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">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 punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">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)">"example-agent"</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">users</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">listen</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)">"mention"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(98, 114, 164)"># "mention" | "message" | "all"</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">overthink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><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">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</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 key atrule">bots</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">listen</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)">"message"</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">bot_list</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"example-bot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-the-unified-config-pattern">4. The unified config pattern<a href="https://caipe.io/releases/release-0.4.0#4-the-unified-config-pattern" class="hash-link" aria-label="Direct link to 4. The unified config pattern" title="Direct link to 4. The unified config pattern" translate="no">​</a></h3>
<p>All components converge on the same shape:</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">component</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><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 plain">           </span><span class="token comment" style="color:rgb(98, 114, 164)"># flat env vars → ConfigMap → envFrom</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)">""</span><span class="token plain">   </span><span class="token comment" style="color:rgb(98, 114, 164)"># pre-existing Secret → envFrom secretRef</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">externalSecrets</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">false</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">appConfig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </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 plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># structured YAML file, caipe-ui only</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">botConfig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </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 plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># structured YAML file, slack-bot only</span><br></span></code></pre></div></div>
<p><code>config:</code> is always flat. No nesting, no <code>config.env:</code> sub-keys.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-pre-upgrade-checklist">5. Pre-upgrade checklist<a href="https://caipe.io/releases/release-0.4.0#5-pre-upgrade-checklist" class="hash-link" aria-label="Direct link to 5. Pre-upgrade checklist" title="Direct link to 5. Pre-upgrade checklist" translate="no">​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Back up values: <code>helm get values ai-platform-engineering -o yaml &gt; values-backup.yaml</code></li>
<li class="task-list-item"><input type="checkbox" disabled=""> <code>caipe-ui</code>: merge <code>env:</code> into <code>config:</code>, rename <code>seedConfig</code> → <code>appConfig</code></li>
<li class="task-list-item"><input type="checkbox" disabled=""> <code>dynamic-agents</code>: merge <code>env:</code>, drop <code>AUTH_ENABLED</code>, drop OIDC/CORS keys</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <code>slack-bot</code>: restructure named keys into <code>config:</code>, set <code>existingSecret</code></li>
<li class="task-list-item"><input type="checkbox" disabled=""> <code>botConfig</code>: replace <code>qanda</code>/<code>ai_alerts</code>/<code>ai_enabled</code> with the <code>agents</code> list</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <code>helm diff upgrade</code> before applying</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Deploy, then check pod logs for config-loading messages</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rollback">Rollback<a href="https://caipe.io/releases/release-0.4.0#rollback" class="hash-link" aria-label="Direct link to Rollback" title="Direct link to Rollback" translate="no">​</a></h3>
<p><code>helm rollback ai-platform-engineering &lt;previous-revision&gt;</code> and restore the backed-up
values file. These are configuration-only changes, so no data migration has to be undone.
The 0.3.x chart expects the old structure and the old values file works as-is.</p>]]></content>
        <author>
            <name>Sri Aradhyula</name>
            <uri>https://linkedin.com/in/aradhyula</uri>
        </author>
        <author>
            <name>Kevin Kantesaria</name>
            <uri>https://github.com/kevkantes</uri>
        </author>
        <author>
            <name>Shubham Bakshi</name>
            <uri>https://github.com/subbaksh</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
</feed>