<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>SAP Architecture Center Blog</title>
        <link>https://architecture.learning.sap.com/news</link>
        <description>SAP Architecture Center Blog</description>
        <lastBuildDate>Tue, 28 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Live AI Use Cases Show How SAP Delivers Trusted Orchestration and Smarter Execution for Manufacturing and Supply Chain Management]]></title>
            <link>https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case</link>
            <guid>https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case</guid>
            <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A ginger shot, fresh off the line, was the first stop for many visitors at SAP’s booth at Hannover Messe. But the real takeaway was seeing AI in action.]]></description>
            <content:encoded><![CDATA[<p><strong>A ginger shot, fresh off the line, was the first stop for many visitors at SAP’s booth at Hannover Messe. But the real takeaway was seeing AI in action. From mixing the ginger shot to packaging and warehouse delivery, visitors saw how SAP is turning AI ambition into real-world manufacturing execution, delivering end-to-end supply chain management processes, and building the resilience every manufacturer needs.</strong></p>
<p><img decoding="async" loading="lazy" alt="A ginger shot" src="https://architecture.learning.sap.com/assets/images/image-gingershot-1920-x-600-a7cf9e3e301f48166e225ac0cb3e45a9.jpeg" width="1920" height="600" class="img_ev3q"></p>
<p>Held from April 20–24, Hannover Messe is the world’s leading industrial trade fair.</p>
<p>On day one, Christian Klein, CEO of SAP SE, stopped by the SAP booth before joining German Chancellor Friedrich Merz and other industrial leaders on the center stage to discuss the importance of moving from AI ambition to real-world execution.</p>
<p>And visitors to the SAP booth experienced that shift firsthand, following the production of the ginger shot.</p>
<p>Packaged in a neat blue box, the ginger shot was refreshing but that wasn’t the only takeaway. The real takeaway was how SAP’s new set of AI-powered manufacturing and supply chain innovations can deliver connected&nbsp;<a href="https://www.sap.com/products/scm.html" target="_blank" rel="noopener noreferrer" class="">end-to-end supply chain business processes powered by AI</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="supply-chain-orchestration"><strong>Supply chain orchestration</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#supply-chain-orchestration" class="hash-link" aria-label="Direct link to supply-chain-orchestration" title="Direct link to supply-chain-orchestration" translate="no">​</a></h2>
<p>From AI and data and then using SAP’s agentic AI, visitors saw what supply chain orchestration looks like in practice. SAP uses&nbsp;<a href="https://www.sap.com/products/technology-platform/integration-suite/agentic-ai.html" target="_blank" rel="noopener noreferrer" class="">agentic AI</a>, trusted data, and applications to help manufacturers&nbsp;sense, analyze, and act in real time.</p>
<p>Orchestrate your supply chain as a single, connected system using AI and data to sense, analyze, and act in real time</p>
<p><a href="https://www.sap.com/products/scm.html" target="_blank" rel="noopener noreferrer" class="">Learn more</a></p>
<p>At the booth, visitors saw human operators interact with an&nbsp;<a href="https://news.sap.com/2026/03/anybotics-industrial-inspections-into-business-insights/" target="_blank" rel="noopener noreferrer" class="">ANYbotics</a>&nbsp;robot through Joule using natural language to run live, remote field service inspections; Uhlmann’s high-tech glass-fronted packing machine, PacXplorer, in action opposite the CNC machine from DMG MORI that was creating spare parts for the PacXplorer; and, at end of the production cycle, AIMBO’s robot handling the picking and packing of the ginger shot. Both AIMBO and ANYbotics are part of SAP’s growing network of&nbsp;<a href="https://news.sap.com/2025/11/sap-physical-ai-partnerships-new-robotics-pilots/" target="_blank" rel="noopener noreferrer" class="">physical AI partnerships</a>.</p>
<p>In addition to many tours held in German and English, day one also saw tours in Japanese, Chinese, and Portuguese—Brazil was the partner country at Hannover Messe 2026.</p>
<p>Equipped with headphones to block out the noise of the crowds at the booth, visitors heard how SAP’s AI can deliver trusted orchestration and smarter execution for&nbsp;<a href="https://www.sap.com/products/scm/manufacturing.html?pttid=7758&amp;campaigncode=crm-ya22-int-1517076&amp;source=ppc-de-googleads-search-21171603258-164767230150-scm_dss-x-x-x&amp;gclsrc=aw.ds&amp;gad_source=1&amp;gad_campaignid=21171603258&amp;gbraid=0AAAAAolt795Pl54SRzOi9SB4b3xhiUiy4&amp;gclid=CjwKCAjw46HPBhAMEiwASZpLRMbfIbFvB28xNJSlrkYHi3-FPGEf9U0s3tnUUQhFKLnjhGmJzlRZmhoCIJ0QAvD_BwE" target="_blank" rel="noopener noreferrer" class="">manufacturing</a>&nbsp;and&nbsp;<a href="https://www.sap.com/products/scm.html?pttid=7758&amp;campaigncode=crm-ya22-int-1517076&amp;source=ppc-de-googleads-search-21171603258-164767230630-scm_dss-x-x-x&amp;gclsrc=aw.ds&amp;gad_source=1&amp;gad_campaignid=21171603258&amp;gbraid=0AAAAAolt795Pl54SRzOi9SB4b3xhiUiy4&amp;gclid=CjwKCAjw46HPBhAMEiwASZpLRBS2lHDd_-2OAy0EAeN-IHqO8wy7Tzul3SgSyw9xhGTfTWIdLbofbxoCMlgQAvD_BwE" target="_blank" rel="noopener noreferrer" class="">supply chain management</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="live-ai-use-cases-demonstrate-functions-and-benefits"><strong>Live AI use cases demonstrate functions and benefits</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#live-ai-use-cases-demonstrate-functions-and-benefits" class="hash-link" aria-label="Direct link to live-ai-use-cases-demonstrate-functions-and-benefits" title="Direct link to live-ai-use-cases-demonstrate-functions-and-benefits" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="operations-and-insights-use-case"><strong>Operations and insights use case</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#operations-and-insights-use-case" class="hash-link" aria-label="Direct link to operations-and-insights-use-case" title="Direct link to operations-and-insights-use-case" translate="no">​</a></h3>
<p>Here, visitors experienced SAP’s vision of supply chain orchestration. In this vision, supply chain orchestration acts as the nerve center of the enterprise. It uses external alerts such as natural disasters, port congestions, or supplier routes to optimize enterprise logistics and planning using agents.</p>
<p>Benefits can include faster response times with AI-assisted monitoring and automated alerts; improved decision-making with data-driven, operational decisions powered by integrated business AI capabilities; and seamless integration with end-to-end connectivity from supply chain planning through to manufacturing execution and quality control.</p>
<p><strong>Top AI functions</strong></p>
<ul>
<li class=""><a href="https://www.sap.com/products/artificial-intelligence/ai-agents/agent-use-cases.html#scm" target="_blank" rel="noopener noreferrer" class="">Production Planning and Operating Agent</a>&nbsp;can assist with order release and real-time monitoring.</li>
<li class="">A physical AI robot inspects hazards, analyzes inspection data, and identifies root causes.</li>
<li class="">Supply optimization analysis helps summarize insights, analyze, and explain the time-series optimization planning run.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="smart-production-use-case"><strong>Smart production use case</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#smart-production-use-case" class="hash-link" aria-label="Direct link to smart-production-use-case" title="Direct link to smart-production-use-case" translate="no">​</a></h3>
<p>DMG MORI demonstrated production at its CNC machine—as part of an end-to-end process—from engineering to planning to production.</p>
<p>As the white robotic arm of the CNC machine silently moved the pusher spare part&nbsp;after the milling process, visitors learned about the benefits of integration, from design to tool management, CNC programs to&nbsp;<a href="http://www.sap.com/dm" target="_blank" rel="noopener noreferrer" class="">SAP Digital Manufacturing</a>&nbsp;as part of a seamless, integrated process. The production operator dashboard offers the operator on the machine AI capabilities and insights to operational and maintenance information.</p>
<p>The process then continues through to logistics execution with SAP Logistics Management, which helps combine warehousing and transportation capabilities for smaller warehouses.&nbsp; This&nbsp;features an AI-powered logistics assistant that can cut through the noise, automatically gathering, summarizing, and prioritizing critical shipment information. It can also provide real-time shipping prices, bringing to life trusted orchestration and smarter execution.</p>
<p><strong>Top AI functions</strong></p>
<ul>
<li class=""><a href="https://www.sap.com/products/scm/joule-with-sap-logistics-management.html" target="_blank" rel="noopener noreferrer" class="">Joule with SAP Logistics Management</a>&nbsp;uses natural language to help streamline warehouse and transportation operations.</li>
<li class=""><a href="https://www.sap.com/products/artificial-intelligence/ai-agents.html?pttid=7756&amp;campaigncode=crm-ya22-int-1517075&amp;source=ppc-de-googleads-search-21156823187-179484269229-clouderpgrow_s4s-x-x-x&amp;gclsrc=aw.ds&amp;gad_source=1&amp;gad_campaignid=21156823187&amp;gbraid=0AAAAAoT3lP9jHA312OPvRkZmst5xspFg0&amp;gclid=CjwKCAjwhqfPBhBWEiwAZo196jvN5AU7qPiu396zy2KzUZSydByyj0QW6IjqGBuYweSQ1KNjzG4zvhoChKgQAvD_BwE" target="_blank" rel="noopener noreferrer" class="">Joule’s integrated AI agents</a>&nbsp;can provide manufacturing information and support decision-making throughout the workflow.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="intelligent-packaging-use-case"><strong>Intelligent packaging use case</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#intelligent-packaging-use-case" class="hash-link" aria-label="Direct link to intelligent-packaging-use-case" title="Direct link to intelligent-packaging-use-case" translate="no">​</a></h3>
<p>Uhlmann’s PacXplorer and SAP highlighted a fully integrated, high-speed packaging line from SAP S/4HANA, to SAP Digital Manufacturing, down to Uhlmann’s automation layer to produce the packaged ginger shot. The ginger shots were moved away from the line by a mobile autonomous robot from Symovo. This use case showed visitors how SAP supports regulated industries such as pharma and life sciences. &nbsp;</p>
<p>Highlighted benefits include increased operational speed with higher throughput thanks to decreased order processing time, built-in regulatory compliance, reduced manual intervention, inventory transparency, and data integrity across the entire production chain.</p>
<p><strong>Top AI functions</strong></p>
<ul>
<li class="">Condition monitoring-led services can enhance asset uptime and service efficiency by combining AI-driven insights and seamless collaboration across the service ecosystem.</li>
<li class="">AI-empowered flow analysis enables quick process modeling and engineering optimization.</li>
<li class="">Intelligent exception handling is embedded in agent-driven processes.</li>
<li class="">Joule’s integrated AI agents can support decision-making throughout the workflow.</li>
<li class="">Joule can help power order and line insights.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="humanoid-use-case"><strong>Humanoid use case</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#humanoid-use-case" class="hash-link" aria-label="Direct link to humanoid-use-case" title="Direct link to humanoid-use-case" translate="no">​</a></h3>
<p>At the final stop before getting their ginger shots, visitors watched an intelligent humanoid robot perform physical tasks at the end of the packaging line, bridging the gap between digital planning and physical execution, highlighting SAP’s Project Embodied AI.</p>
<p>Benefits of humanoids include increased operational speed with higher throughput due to a decreased order processing time; increased business uptime and cost efficiency especially in areas dangerous or difficult for humans; inventory transparency with real-time data integrity across the warehouse; and physical-digital alignment eliminating misalignment between planning and execution.</p>
<p><strong>Top AI functions</strong></p>
<ul>
<li class="">Joule and Joule Studio can enable robots to understand the physical world, make autonomous decisions, and learn from their environment for smarter operations.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-than-a-quick-refuel"><strong>More than a quick refuel</strong><a href="https://architecture.learning.sap.com/news/2026/04/28/live-ai-use-case#more-than-a-quick-refuel" class="hash-link" aria-label="Direct link to more-than-a-quick-refuel" title="Direct link to more-than-a-quick-refuel" translate="no">​</a></h2>
<p>At the end of their visit, visitors got so much more than a quick refuel to slake their thirst. Following the creation of the ginger shot from recipe development and planning to production with mixing, filling, and packing, visitors came away with a clear understanding of how SAP is connecting insight to execution with trusted orchestration and smarter execution. And, it is this trusted orchestration and smarter execution that is building the resilience every manufacturer needs in today’s world.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Agentic Code Quality Funnel]]></title>
            <link>https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering</link>
            <guid>https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering</guid>
            <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The quality layers that let your coding agents move fast without leaving reliability behind.]]></description>
            <content:encoded><![CDATA[<p><strong>TL;DR:</strong> Coding agents excel at writing code fast, but code produced fast is not the same as code that truly works. Debugging it after the fact is often the most expensive way to utilize AI. Every fix cycle with the agent, waiting for a new attempt, then testing it again can quickly turn enthusiasm into frustration. Our agentic code quality funnel changed the equation.</p>
<p><img decoding="async" loading="lazy" alt="The Agentic Code Quality Funnel" src="https://architecture.learning.sap.com/assets/images/agentic-code-quality-funnel-48808463e87827c2743bf5b2c07ebeef.webp" width="2560" height="2000" class="img_ev3q"></p>
<p>Let's use Claude Code to build an SAP Extensions app. With a grounded spec, it built our prototype in less than thirty minutes. A <strong>Financial Risk Analyzer</strong> built as a CAP backend with a Fiori Elements frontend that reads GL transaction data, runs anomaly detection through SAP AI Core, and surfaces risk classifications in a List Report. The full source is on <a href="https://github.com/SAP-samples/cap-agentic-engineered" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<p>Excitement is not just getting code done fast but code that's reliable and truly works for the enterprise. Claude fully tested the app. Then I opened it and got a blank page. Several debugging rounds later the page showed up but columns came up empty, buttons did nothing, and the risk data never reached the frontend. It was not one bug. Several issues including deprecated annotations the runtime silently ignored, naming mismatches between the controller and what Fiori Elements actually looks for, and OData wiring that looked correct but had no execution path in V4.</p>
<p><img decoding="async" loading="lazy" alt="Financial Risk Analyzer, Fiori Elements List Report showing GL transactions with risk classifications, criticality indicators, and anomaly scores" src="https://architecture.learning.sap.com/assets/images/sample-cap-app-screenshot-6ae5a85512568405d4afbada248ecde7.png" width="3454" height="1528" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-sap-mcp-servers-advantage">The SAP MCP Servers Advantage<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#the-sap-mcp-servers-advantage" class="hash-link" aria-label="Direct link to The SAP MCP Servers Advantage" title="Direct link to The SAP MCP Servers Advantage" translate="no">​</a></h2>
<p>Frontier models aren't lacking intelligence. They're really good. But SDKs, APIs, tools, and frameworks evolve rapidly. New library versions ship constantly, yet these models are trained on specifications that become obsolete by the time they ship. They can't be trained at the speed that tools and frameworks evolve. The challenge becomes feeding the model with the right context, grounded in best practices and sources of truth that are up to date.</p>
<p>SAP MCP servers give the coding agent real-time access to domain expertise. Not static documentation, but callable tools it consults while it works. Skills complement them with procedural knowledge: your team's deploy process, review checklist, CDS modeling conventions.</p>
<p>For my SAP projects, three MCP servers made the biggest difference:</p>
<ul>
<li class=""><strong>CAP MCP Server:</strong> guides CDS entity modeling, service definitions, and backend patterns according to current CAP conventions</li>
<li class=""><strong>Fiori MCP Server:</strong> ensures Fiori Elements applications follow SAP UX guidelines, annotation patterns, and page configurations</li>
<li class=""><strong>UI5 MCP Server:</strong> provides UI5 Web Components guidance, control usage, and binding patterns</li>
</ul>
<p>Once I equipped Claude Code with these servers, it stopped guessing at SAP conventions. It checked. The agent queried the CAP MCP server before defining an entity, consulted the Fiori MCP server before configuring a list report page, and validated control usage against the UI5 MCP server before writing a view.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-development-loop-before-and-after">The Development Loop, Before and After<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#the-development-loop-before-and-after" class="hash-link" aria-label="Direct link to The Development Loop, Before and After" title="Direct link to The Development Loop, Before and After" translate="no">​</a></h3>
<p>Here is how that improves the development loop:</p>
<p><img decoding="async" loading="lazy" alt="The development loop, before and after MCP" src="https://architecture.learning.sap.com/assets/images/sequence-dev-loop-a1a00704e8b5943217a5b525647578ee.webp" width="1200" height="1100" class="img_ev3q">
We ran a two-pass review. First: Claude reviews the prototype using only its training knowledge. Second: we validate every recommendation against the three MCP servers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="27-of-recommendations-were-wrong">27% of Recommendations Were Wrong<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#27-of-recommendations-were-wrong" class="hash-link" aria-label="Direct link to 27% of Recommendations Were Wrong" title="Direct link to 27% of Recommendations Were Wrong" translate="no">​</a></h3>
<p>Without the SAP MCP servers, the coding agent general knowledge produced 15 recommendations. But four were wrong:</p>
<table><thead><tr><th>Recommendation</th><th>What MCP Said</th><th>Verdict</th></tr></thead><tbody><tr><td>Rename <code>GLTransactions</code> to singular <code>GLTransaction</code></td><td>CAP MCP: "Entities should be plural"</td><td><strong>Wrong.</strong> Plural is correct per CDS convention.</td></tr><tr><td>Add KPI header facets to the List Report</td><td>Fiori MCP: KPI facets require the Analytical List Page floorplan</td><td><strong>Wrong.</strong> Runtime error on a List Report.</td></tr><tr><td>Use <code>cuid</code> aspect for auto-generated keys</td><td>CAP MCP: composite keys are valid for ERP-sourced data</td><td><strong>Wrong.</strong> Would break the data pipeline from source systems.</td></tr><tr><td>Refactor to Composition pattern</td><td>CAP MCP: flat entities are fine for read-heavy ML result tables</td><td><strong>Wrong.</strong> Unnecessary complexity.</td></tr></tbody></table>
<p>A 27% error rate on architectural decisions from a frontier model. These aren't cosmetic. Renaming an entity breaks every OData URL, KPI facets on the wrong floorplan crash at runtime, and <code>cuid</code> would force a restructure of the entire data ingestion from SAP.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-button-that-did-nothing-wiring-unbound-actions">The Button That Did Nothing: Wiring Unbound Actions<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#the-button-that-did-nothing-wiring-unbound-actions" class="hash-link" aria-label="Direct link to The Button That Did Nothing: Wiring Unbound Actions" title="Direct link to The Button That Did Nothing: Wiring Unbound Actions" translate="no">​</a></h3>
<p>The Analyze Risks button was the worst offender. The agent had wired it via a <code>UI.DataFieldForAction</code> CDS annotation pointing to an unbound action:</p>
<div class="language-cds codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cds codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ❌ Without MCP: DataFieldForAction for unbound action</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">annotate RiskService.GLTransactions with @(</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  UI.LineItem: [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    // ... data field columns ...</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { $Type: 'UI.DataFieldForAction', Action: 'RiskService.analyzeRisks', Label: '{i18n&gt;Analyze}' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">);</span><br></div></code></pre></div></div>
<p>The button rendered in the toolbar. Looked correct. But clicking it? Nothing. No network request, no error, completely silent (a classic 'needle in a haystack' problem, as my colleague recently <a class="" href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging">wrote about</a>). The Fiori MCP server flags this pattern: <code>UI.DataFieldForAction</code> with an unbound action has no execution path in OData V4. The runtime renders the button but never wires it. With MCP, the agent was guided to a manifest custom action instead:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// ✅ With Fiori MCP: manifest custom action for unbound actions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token property">"controlConfiguration"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"@com.sap.vocabularies.UI.v1.LineItem"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token property">"actions"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token property">"analyzeRisksAction"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token property">"press"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"risk.analysis.ext.controller.ListReportExt.analyzeRisks"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token property">"text"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"{{AnalyzeRisks}}"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token property">"requiresSelection"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="virtual-fields-the-performance-bug-mcp-would-have-prevented">Virtual Fields: The Performance Bug MCP Would Have Prevented<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#virtual-fields-the-performance-bug-mcp-would-have-prevented" class="hash-link" aria-label="Direct link to Virtual Fields: The Performance Bug MCP Would Have Prevented" title="Direct link to Virtual Fields: The Performance Bug MCP Would Have Prevented" translate="no">​</a></h3>
<p>This one cost us real debugging time. The Fiori Elements list report loaded slowly and the browser console was full of errors:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">Failed to drill-down into (...)/anomalyScoreResult, invalid segment: anomalyScoreResult</span><br></div></code></pre></div></div>
<p>Hundreds of these, one per row per render cycle. The root cause: the <code>after('READ')</code> handler only set virtual fields when a cached prediction existed. Before the user clicks "Analyze," the cache is empty, so the handler left the fields unset:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// ❌ Before: virtual fields missing from response when uncached</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">after</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'READ'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'GLTransactions'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">results</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> row </span><span class="token keyword" style="color:rgb(86, 156, 214)">of</span><span class="token plain"> results</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> cached </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> riskCache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">row</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access maybe-class-name">DocumentNumber</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">_</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">row</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access maybe-class-name">LineItem</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        row</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">riskClassification</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">riskClassification</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        row</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">criticality</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">criticality</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)">// No else: fields left undefined</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>OData V4's <code>$select</code> included these fields because the annotations reference them. But the server omitted them from the response payload because they were <code>undefined</code>. The client then failed the property drill-down on every row, every read, producing both the console noise and measurable performance degradation.</p>
<p>The fix is one <code>else</code> branch:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// ✅ With Fiori MCP: virtual fields always present in OData response</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">after</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'READ'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'GLTransactions'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">results</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> row </span><span class="token keyword" style="color:rgb(86, 156, 214)">of</span><span class="token plain"> results</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> cached </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> riskCache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">row</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access maybe-class-name">DocumentNumber</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">_</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">row</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access maybe-class-name">LineItem</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      row</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">riskClassification</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cached </span><span class="token operator" style="color:rgb(212, 212, 212)">?</span><span class="token plain"> cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">riskClassification</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      row</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">riskExplanation</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cached </span><span class="token operator" style="color:rgb(212, 212, 212)">?</span><span class="token plain"> cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">riskExplanation</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      row</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">anomalyScoreResult</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cached </span><span class="token operator" style="color:rgb(212, 212, 212)">?</span><span class="token plain"> cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">anomalyScoreResult</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      row</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">criticality</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cached </span><span class="token operator" style="color:rgb(212, 212, 212)">?</span><span class="token plain"> cached</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">criticality</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>This is exactly the kind of bug that sits at the intersection of CAP virtual field semantics and OData V4 client behavior. General training knowledge does not cover it. An MCP-grounded agent that understands how CAP serializes virtual fields into OData responses would not leave them undefined.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="criticality-values-one-number-wrong-dashboard">Criticality Values: One Number, Wrong Dashboard<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#criticality-values-one-number-wrong-dashboard" class="hash-link" aria-label="Direct link to Criticality Values: One Number, Wrong Dashboard" title="Direct link to Criticality Values: One Number, Wrong Dashboard" translate="no">​</a></h3>
<p>Without Fiori MCP, the agent got the criticality mapping wrong:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// ❌ Without MCP: agent guessed criticality values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(100, 102, 149)">RISK_LABELS</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string-property property">"Normal"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">criticality</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// Agent assumed 0 = positive/green</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string-property property">"High_Amount_Deviation"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">criticality</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string-property property">"New_Combination"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">criticality</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The Fiori MCP server returned the actual OData V4 vocabulary values. <code>0</code> means Neutral (grey), <code>3</code> means Positive (green). One number, but it determines whether your risk dashboard communicates anything at all:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// ✅ With Fiori MCP: grounded in OData V4 vocabulary</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(100, 102, 149)">RISK_LABELS</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string-property property">"Normal"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">criticality</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// 3 = Positive/green per OData spec</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string-property property">"High_Amount_Deviation"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">criticality</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string-property property">"New_Combination"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">criticality</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cds-enum-types-and-naming-conventions">CDS Enum Types and Naming Conventions<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#cds-enum-types-and-naming-conventions" class="hash-link" aria-label="Direct link to CDS Enum Types and Naming Conventions" title="Direct link to CDS Enum Types and Naming Conventions" translate="no">​</a></h3>
<p>But the CAP MCP server went further than just correcting the value. It confirmed that CDS enum types are the right pattern for fields with a fixed set of valid states, and flagged a detail you won't find in most training data: <strong>Integer enums require explicit values.</strong> Omit them and the CDS compiler errors out:</p>
<div class="language-cds codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cds codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ❌ Without MCP: raw types, no documentation, no compiler safety</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">virtual riskClassification : String;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">virtual criticality        : Integer;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ✅ With CAP MCP: enum types with explicit values</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">type Criticality : Integer enum {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  Neutral  = 0;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  Negative = 1;  // red</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  Critical = 2;  // orange</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  Positive = 3;  // green</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">};</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">type RiskClassification : String enum {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  Normal          = 'Normal';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  UnusualAmount   = 'Unusual Amount';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  HighAmountNew   = 'High Amount + New Pattern';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  // ... 10 more classifications</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">};</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">virtual riskClassification : RiskClassification;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">virtual criticality        : Criticality;</span><br></div></code></pre></div></div>
<p>The enum is the source of truth, not a comment, not a wiki page, not tribal knowledge.</p>
<p>Naming conventions were another quiet catch. The 24 ML feature columns came from the Python model using <code>snake_case</code>: <code>anomaly_score</code>, <code>peer_amount_stddev</code>, <code>posting_delay_days</code>. But every CDS example the CAP MCP server returned used <code>camelCase</code>. That's not a style preference. It's how Fiori Elements generates labels. Rename <code>anomaly_score</code> to <code>anomalyScore</code> and the table header reads "Anomaly Score" automatically. Keep <code>snake_case</code> and you ship a professional risk dashboard with column headers like <code>anomaly_score</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="beyond-mcp-playwright-and-the-filter-bar">Beyond MCP: Playwright and the Filter Bar<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#beyond-mcp-playwright-and-the-filter-bar" class="hash-link" aria-label="Direct link to Beyond MCP: Playwright and the Filter Bar" title="Direct link to Beyond MCP: Playwright and the Filter Bar" translate="no">​</a></h3>
<p>Code that compiles isn't code that works. <strong>Playwright MCP</strong> gave the agent eyes on the running application. Without browser access, the coding agent couldn't catch blank pages or broken wiring. I'd open the app, see the failure, paste the error back, and repeat. With Playwright, the agent launched a headless browser, took screenshots, and iterated without waiting for me. That's the concrete mechanism behind agentic engineering: coding agents that create, test, iterate, and debug <em>independently</em>.</p>
<p>One of the first things Playwright caught was a usability problem no linter would flag. Twenty-four fields in the filter bar. My Financial Risk Analyzer has 24 ML feature columns (<code>anomalyScore</code>, <code>peerAmountStddev</code>, <code>postingDelayDays</code>) and every single one showed up as a filter option. Nobody filters risk transactions by <code>peerAmountStddev</code>. The Fiori MCP server pointed to <code>@UI.HiddenFilter</code>:</p>
<div class="language-cds codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cds codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ❌ Without Fiori MCP: feature columns clutter the filter bar (28 fields)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">anomalyScore @title: '{i18n&gt;feat_anomalyScore}' @UI.Importance: #Low;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ✅ With Fiori MCP: hidden from filters, still available in table personalization</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">anomalyScore @title: '{i18n&gt;feat_anomalyScore}' @UI.Importance: #Low @UI.HiddenFilter;</span><br></div></code></pre></div></div>
<p>For date and amount fields, Fiori MCP pointed to <code>Capabilities.FilterRestrictions</code>, not something you'll find in a typical CAP tutorial:</p>
<div class="language-cds codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cds codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ✅ Fiori MCP: 'SingleRange' enables date/amount range pickers</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">annotate RiskService.GLTransactions with @(</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  Capabilities.FilterRestrictions: {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    FilterExpressionRestrictions: [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { Property: PostingDate, AllowedExpressions: 'SingleRange' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { Property: Amount,      AllowedExpressions: 'SingleRange' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">);</span><br></div></code></pre></div></div>
<p>Four focused filter fields with proper range sliders instead of twenty-four. That's the line between a demo and a tool someone uses daily.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-equip-your-agent-to-get-it-right">How to Equip Your Agent to Get It Right<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#how-to-equip-your-agent-to-get-it-right" class="hash-link" aria-label="Direct link to How to Equip Your Agent to Get It Right" title="Direct link to How to Equip Your Agent to Get It Right" translate="no">​</a></h2>
<p>In practice, four configuration layers work together:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// .claude/settings.json: MCP server configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"mcpServers"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token property">"cap"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token property">"command"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"npx"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"args"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"@cap-js/mcp-server"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token property">"fiori"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token property">"command"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"npx"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"args"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"@sap-ux/fiori-mcp-server"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token property">"ui5"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token property">"command"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"npx"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"args"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"@ui5/mcp-server"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token property">"playwright"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token property">"command"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"npx"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"args"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"@anthropic-ai/playwright-mcp"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"--headless"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token title important punctuation" style="color:rgb(212, 212, 212)">#</span><span class="token title important"> AGENTS.md: SAP project instructions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">For SAP-code specific, query SAP MCP servers before writing code.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">/sap-cap</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain">: queries CAP MCP for CDS entities, types, and services</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">/sap-fiori</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain">: queries Fiori MCP for annotations and Fiori Elements config</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">/sap-ui5</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain">: queries UI5 MCP for controllers, XML views, and controls</span><br></div></code></pre></div></div>
<p>That's it. Edit a file under <code>app/</code>, the Fiori skill loads. Edit a service definition under <code>srv/</code>, the CAP skill loads. Edit a controller, the UI5 skill loads. No routing tables, no guessing which server to query. The path does the work.</p>
<p>It's important to keep in mind to only adopt MCP servers that have been verified from a security standpoint. Only install servers you trust.</p>
<p>Still, correct SAP patterns aren't enough if the architecture is wrong. That's why you need to ensure your spec doesn't have any gaps and covers solid enterprise architecture principles, including zero-trust.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="beyond-correctness-architecture-principles">Beyond Correctness: Architecture Principles<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#beyond-correctness-architecture-principles" class="hash-link" aria-label="Direct link to Beyond Correctness: Architecture Principles" title="Direct link to Beyond Correctness: Architecture Principles" translate="no">​</a></h2>
<p>I reviewed the working Financial Risk Analyzer, the one MCP had gotten right on the first pass, and found an unscoped OData endpoint and no input validation. The SAP patterns were correct but security was missing. And security was just the first gap. Performance efficiency, reliability, scalability: the principles you apply before designing any enterprise solution weren't considered for the generated code.</p>
<p>I needed a system design methodology. Traditionally, I'd write the technical specification with a certain level of detail. Even documenting just the important parts would take time. That led me to a spec-driven-development tool (e.g., <a href="https://github.com/obra/superpowers" target="_blank" rel="noopener noreferrer" class="">superpowers</a>).</p>
<p>Before I let the agent produce any code, an SDD tool when grounded with your architecture principles, will interview you and ensure there are no gaps from the security posture, performance budgets, reliability expectations, scalability constraints. Those were some of the fundamental pillars I'd define as an architect before designing any solution.</p>
<p>The difference was immediate. With a complete spec shaped by architecture principles along with SAP MCP skills, the agent didn't just write correct SAP code. It wrote code that reflected the non-functional requirements an enterprise application actually needs. Every session inherited that spec. No context rot. No re-explaining the same constraints.</p>
<p>The agent built a working Risk Service with a correct CDS entity, proper annotations, functional action handler. But it shipped without any authorization:</p>
<div class="language-cds codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cds codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ❌ Without architecture principles: wide open</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">service RiskService {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  entity GLTransactions as projection on risk.GLTransactions;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  action analyzeRisks() returns array of GLTransactions;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>Every authenticated user could trigger AI Core inference. The CAP MCP server confirmed the two-level pattern: service-level access control plus action-level role restriction. That's not something you discover from CDS syntax guides. It comes from thinking about who should access what:</p>
<div class="language-cds codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cds codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">// ✅ With CAP MCP: service + action level authorization</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">service RiskService @(requires: 'authenticated-user') {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  @readonly</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  entity GLTransactions as projection on risk.GLTransactions;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  @(requires: 'RiskAnalyst')</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  action analyzeRisks() returns array of GLTransactions;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><code>authenticated-user</code> locks down the OData endpoint. <code>RiskAnalyst</code> restricts the expensive AI Core call to users who actually need it. The MCP server didn't invent the security requirement. The architecture spec did. MCP made sure the implementation followed current CAP conventions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="secure-the-code-your-agent-writes-it-wont-do-it-for-you">Secure the Code Your Agent Writes. It Won't Do It for You.<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#secure-the-code-your-agent-writes-it-wont-do-it-for-you" class="hash-link" aria-label="Direct link to Secure the Code Your Agent Writes. It Won't Do It for You." title="Direct link to Secure the Code Your Agent Writes. It Won't Do It for You." translate="no">​</a></h2>
<p>Even after equipping your agent, we should <strong>always assume code is untrusted</strong>. MCP servers teach convention. An SDD tool improves the spec's quality. Still, the security scan flagged 53 vulnerabilities! The agent had scaffolded the project with older versions of the libraries instead of pulling <code>@latest</code>, and those older versions carried vulnerable dependencies underneath.</p>
<p>The spec never told the agent to use <code>@latest</code> or run <code>npm audit</code> after scaffolding. Security starts in the spec: install dependencies at their latest versions, audit what's underneath, and make that a gate before any application code is written.</p>
<p>That covers what the agent produces. What about what you feed it? Anything it reads becomes model context, including files you didn't intend to share. List <code>.env</code>, <code>default-env.json</code>, and service keys in <code>.claudeignore</code> to keep them out of the agent's view. Only expose data the agent needs. Never enter personal or customer data into prompts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="protect-what-your-agent-sends">Protect What Your Agent Sends<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#protect-what-your-agent-sends" class="hash-link" aria-label="Direct link to Protect What Your Agent Sends" title="Direct link to Protect What Your Agent Sends" translate="no">​</a></h2>
<p>When the coding agent sends code to a model provider, it carries business logic and intellectual property. I need a contractual guarantee that none of it gets used for training or sold to a third party. Going direct to model providers doesn't give me that through a single agreement. Running through SAP's <strong>Gen AI Hub</strong> does. SAP's agreements with providers ensure your data stays yours.</p>
<p>That same infrastructure solves a second problem. Agentic workflows benefit from multiple frontier models. Strengths vary by task, and a second opinion from a different model is a real advantage. <strong>LiteLLM</strong> gives me a single gateway into Gen AI Hub: one integration point, one SAP API key, every frontier model available immediately, at volume pricing SAP negotiates with hyperscalers. Behind that gateway, Gen AI Hub handles content filters and PII masking on every request, guardrails I'd otherwise have built myself.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># litellm_config.yaml: single gateway to SAP Gen AI Hub</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">sonnet</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> sap_ai_core/anthropic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">claude</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">4.6</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">sonnet</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">opus</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> sap_ai_core/anthropic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">claude</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">4.6</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">opus</span><br></div></code></pre></div></div>
<p>The full-stack picture: <strong>Fiori</strong> on the frontend, <strong>CAP</strong> on the backend, <strong>Gen AI Hub</strong> for intelligent services, <strong>BTP</strong> for runtime and backing services like Destination and HANA Cloud. The coding agent works across this entire stack, guided at every layer by SAP-specific tooling.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-means-for-your-team">What This Means For Your Team<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#what-this-means-for-your-team" class="hash-link" aria-label="Direct link to What This Means For Your Team" title="Direct link to What This Means For Your Team" translate="no">​</a></h2>
<p>The prototypes made one thing clear: agents write code fast, but they're working from training data that's already stale. SDKs and API specs change. The code written by AI compiles, but breaks at runtime, and AI can't fix them easily without several iterations leading to an enormous waste of time and effort.</p>
<p>SAP's extension ecosystem has always been powerful, and it has always demanded deep professional knowledge to get right. That knowledge barrier is real. It is why SAP projects take months and why extension backlogs grow faster than teams can deliver.</p>
<p>MCP servers do not eliminate that barrier. They democratize access to it. The servers encode the same best practices that senior SAP architects carry: CDS conventions, annotation semantics, authorization patterns, controller extension boundaries. An agent equipped with these servers reflects that expertise, even when the developer driving the session is building their first Fiori app.</p>
<p>Here's what that workflow looks like end to end:</p>
<p><img decoding="async" loading="lazy" alt="The agentic development loop, end to end" src="https://architecture.learning.sap.com/assets/images/sequence-sdd-loop-aefcf74f6f7693779be693adcc1ff0a9.webp" width="1200" height="1095" class="img_ev3q">
To see the complete implementation (CAP backend, Fiori Elements frontend, and AI Core integration) explore the <a href="https://github.com/SAP-samples/cap-agentic-engineered" target="_blank" rel="noopener noreferrer" class="">source code on GitHub</a>. Your SAP investment already includes the platform. The question is whether you equip your agents to use it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">References<a href="https://architecture.learning.sap.com/news/2026/04/27/agentic-engineering#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<p><strong>SAP MCP Servers</strong></p>
<ul>
<li class=""><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/boost-your-cap-development-with-ai-introducing-the-mcp-server-for-cap/ba-p/14202849" target="_blank" rel="noopener noreferrer" class="">CAP MCP Server</a>: MCP server for SAP Cloud Application Programming Model (CAP) development</li>
<li class=""><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-fiori-tools-update-first-release-of-the-sap-fiori-mcp-server-for/ba-p/14204694" target="_blank" rel="noopener noreferrer" class="">Fiori MCP Server</a>: Helps AI models create and modify SAP Fiori applications</li>
<li class=""><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/give-your-ai-agent-some-tools-introducing-the-ui5-mcp-server/ba-p/14200825" target="_blank" rel="noopener noreferrer" class="">UI5 MCP Server</a>: UI5 Web Components development assistance</li>
</ul>
<p><strong>Agentic Engineering &amp; Spec-Driven Development</strong></p>
<ul>
<li class=""><a class="" href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging">Finding the Needle: AI-Assisted Debugging Across Thousands of Lines and Megabytes of Logs</a>: How a coding agent resolved an intermittent auth failure across Kubernetes and SAP AI Core in 60 minutes instead of 12+ hours, by correlating logs and tracing credential conflicts no single engineer could spot at once</li>
<li class=""><a href="https://github.com/obra/superpowers" target="_blank" rel="noopener noreferrer" class="">superpowers</a>: Spec-driven development framework that guides coding agents through structured requirements gathering</li>
<li class=""><a href="https://github.com/gsd-build/get-shit-done" target="_blank" rel="noopener noreferrer" class="">GSD</a>: Meta-prompting, context engineering, and spec-driven development system for coding agents</li>
<li class=""><a href="https://github.com/Fission-AI/OpenSpec" target="_blank" rel="noopener noreferrer" class="">OpenSpec</a>: Spec-driven development tool that adds a lightweight specification layer before code is written</li>
</ul>
<p><strong>Developer Tooling MCP Servers</strong></p>
<ul>
<li class=""><a href="https://github.com/microsoft/playwright-mcp" target="_blank" rel="noopener noreferrer" class="">Playwright MCP</a>: Headless browser automation for coding agents. Navigate, screenshot, and verify UI</li>
</ul>
<p><strong>SAP Platform</strong></p>
<ul>
<li class=""><a href="https://docs.litellm.ai/docs/providers/sap" target="_blank" rel="noopener noreferrer" class="">LiteLLM SAP Provider</a>: Gateway to SAP AI Foundation via Gen AI Hub</li>
<li class=""><a href="https://code.claude.com/docs" target="_blank" rel="noopener noreferrer" class="">Claude Code Documentation</a>: Official Claude Code docs, skills, MCP, and quickstart guides</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Finding the Needle: AI-Assisted Debugging Across Thousands of Lines and Megabytes of Logs]]></title>
            <link>https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging</link>
            <guid>https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging</guid>
            <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI-Assisted Debugging Across Thousands of Lines of Cloud API Logs with Claude and SAP — Tracing a Hidden Credential Bug in Less Than 60 Minutes.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-happens-when-you-let-claude-code-run-the-full-debugging-loop">What happens when you let Claude Code run the full debugging loop<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#what-happens-when-you-let-claude-code-run-the-full-debugging-loop" class="hash-link" aria-label="Direct link to What happens when you let Claude Code run the full debugging loop" title="Direct link to What happens when you let Claude Code run the full debugging loop" translate="no">​</a></h2>
<p><strong>TL;DR:</strong> Intermittent HTTP 400, full agent flow only, every isolated test passing. Root cause: two conflicting sets of SAP AI Core credentials coexisting silently in the same Kubernetes secret - standalone production vars that the SDK prioritised over the staging service key, causing every token request to fetch from the wrong OAuth endpoint. The agent connected to staging with a production token. SAP's proxy rejected it: tenant not found. We were stuck. Nothing pointed anywhere obvious. A team of 2–3 engineers would have spent 12–15 hours total on this. Claude Code did it in 60 minutes, on claude-sonnet-4.5, averaging ~20 tokens of human input per turn.</p>
<p>We've encoded the debugging patterns into a reusable <a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#the-claude-code-skill---reusable-debugging-pattern" class="">Claude Code skill</a> you can drop into your own projects.</p>
<p>The prompt that unlocked it:</p>
<blockquote>
<p>"I have a bug that only reproduces in the full system flow. Here is the error and the logs. Read the code end-to-end, correlate log timestamps across all components, trace the full execution path from startup through the failure point. Use process of elimination - what do the logs rule out, what does the code rule out, what remains. Generate tests that reproduce the failure condition, not just unit tests for individual functions, but tests that exercise the sequence and state that leads to the bug."</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-were-dealing-with">What We Were Dealing With<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#what-we-were-dealing-with" class="hash-link" aria-label="Direct link to What We Were Dealing With" title="Direct link to What We Were Dealing With" translate="no">​</a></h2>
<p><strong>Quick SAP Context:</strong> <a href="https://help.sap.com/docs/sap-ai-core" target="_blank" rel="noopener noreferrer" class="">SAP AI Core</a> is SAP's managed AI/ML runtime on <a href="https://www.sap.com/products/technology-platform.html" target="_blank" rel="noopener noreferrer" class="">SAP Business Technology Platform (BTP)</a>. It handles model serving, training, and inference at enterprise scale. Authentication uses service keys (JSON blobs containing OAuth client credentials) that get injected into your applications via the <a href="https://pypi.org/project/generative-ai-hub-sdk/" target="_blank" rel="noopener noreferrer" class="">SAP AI SDK</a>. The SDK supports two credential paths: a composite service key JSON, or individual environment variables. This flexibility is convenient — and, as we discovered, a source of subtle bugs when both coexist.</p>
<p>WebRTC based voice agent on Kubernetes, connected to SAP AI Core to reach a Speech to Speech model. Every staging deployment failing with HTTP 400: server rejected WebSocket connection. Live environment fine. Every isolated test passed. Direct WebSocket, raw SDK connect, synthetic session - all worked. Endpoint, headers, token format - all correct. The failure only appeared in the full agent flow, and only sometimes. The kind of intermittent bug where you can't even confirm it's real without spending half a day first. We tried everything we could think of. Nothing pointed anywhere obvious. That's when we handed it to Claude Code - not with a neat hypothesis, just the error, the logs, and "figure it out."</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-scale-problem">The Scale Problem<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#the-scale-problem" class="hash-link" aria-label="Direct link to The Scale Problem" title="Direct link to The Scale Problem" translate="no">​</a></h2>
<p>The codebase spans multiple modules. Startup touches auth, plugin initialization, session construction, and model factory - each in a different file. Kubernetes adds environment variable injection from secrets, adding ordering sensitivity on top. The logs aren't a single file. They're timestamped output from the agent worker, WebRTC room, WebSocket handshake, and OAuth exchange - all interleaved. The signal was matching a WebSocket rejection at T+8s to a token fetch at T+0.2s during prewarm. Across multiple streams. Manually. Not hard to reason about - hard to hold all at once. Thousands of lines of code, megabytes of logs, a bug that only fires under a specific sequence.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-claude-code-found">What Claude Code Found<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#what-claude-code-found" class="hash-link" aria-label="Direct link to What Claude Code Found" title="Direct link to What Claude Code Found" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Human vs Claude Code Investigation Paths" src="https://architecture.learning.sap.com/assets/images/investigation-fe1e78c1f2d351cd0e01774f1d6adf87.svg" width="1218" height="1240" class="img_ev3q"></p>
<p>The Kubernetes secret had been populated with two overlapping sets of AI Core credentials:</p>
<ol>
<li class=""><code>AICORE_SERVICE_KEY</code> - the staging service key JSON (correct, for the STS model Live staging endpoint)</li>
<li class=""><code>AICORE_AUTH_URL</code>, <code>AICORE_BASE_URL</code>, <code>AICORE_CLIENT_ID</code>, <code>AICORE_CLIENT_SECRET</code> - standalone production credentials from a different service, left in by mistake</li>
</ol>
<p>The SAP AI SDK's credential resolution priority: when individual <code>AICORE_*</code> vars are present in the environment, the SDK uses them directly and does not parse the service key JSON at all. The standalone vars pointed to SAP's production AI Core. The SDK fetched a production OAuth token. That token was then sent to the staging STS model endpoint. SAP's staging proxy decoded the JWT, found a tenant it didn't recognise, and returned:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token plain">HTTP 400 Bad Request</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">{"error": "Missing Tenant Id"}</span><br></div></code></pre></div></div>
<p>The error was perfectly accurate. It just didn't name the cause.</p>
<p>What made this so hard to find: the conflict was invisible at the code level. <code>_init_aicore_env(service_key)</code> looked correct. But the SDK reads environment variables at token-fetch time, not at parse time. In the full agent flow, <code>prewarm_auth()</code> fires early during pod startup before model initialisation. The K8s secret injects all vars simultaneously at pod start. Isolated tests called setup directly and never triggered prewarm - the bug lived entirely in the gap between how tests run and how the agent actually starts in the cluster.</p>
<p><strong>The fix:</strong> remove the conflicting standalone vars from the secret entirely. Keep only <code>AICORE_SERVICE_KEY</code> and <code>AICORE_RESOURCE_GROUP</code> - everything else is derived at runtime. Plus a defence-in-depth change to <code>_init_aicore_env</code> to detect credential changes and invalidate the token cache before overwriting env vars, so even if both paths are ever present again a credential switch forces a fresh token.</p>
<p>Then without being asked - Claude Code argued against its own fix. "Are there other code paths that could fetch a token before <code>_init_aicore_env</code> runs?" Traced the callers, confirmed <code>prewarm_auth()</code> now correctly initialises from the service key before fetching, wrote two regression tests that reproduce the exact startup sequence that triggers the conflict.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-numbers">The Numbers<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#the-numbers" class="hash-link" aria-label="Direct link to The Numbers" title="Direct link to The Numbers" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Time Breakdown: Human vs Claude Code" src="https://architecture.learning.sap.com/assets/images/time-breakdown-56138e9d5026dfb3145dfbf8a30fc589.webp" width="865" height="1070" class="img_ev3q"></p>
<ul>
<li class=""><strong>617K output tokens</strong> - code written, hypotheses reasoned, tests generated</li>
<li class=""><strong>166K token peak context</strong> - codebase, logs, SDK source, all held simultaneously at peak</li>
<li class=""><strong>54K input tokens</strong> - everything the human typed, entire session, ~20 tokens per turn</li>
<li class=""><strong>12–15 hours → 60 minutes</strong></li>
</ul>
<p>Twenty tokens of human input per turn driving 617K tokens of reasoning and fixing.</p>
<p>One more thing: this ran across multiple days. Claude Code's automatic context compaction summarized earlier history as the session grew, keeping the window within limits without losing conclusions. Without it, a multi-day investigation stalls. With it, the session just keeps going.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="governance-first">Governance First<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#governance-first" class="hash-link" aria-label="Direct link to Governance First" title="Direct link to Governance First" translate="no">​</a></h2>
<p>Claude Code was routed through an internal LLM gateway. Every token in, every token out, every model call logged, attributed, and visible centrally. No API keys scattered across laptops. No blind spots on spend. No model version drift across teams. For enterprise environments, the ability to answer "what did our AI tooling do last month, who used it" without scraping individual machines is non-negotiable.</p>
<p>On top of that:</p>
<ul>
<li class=""><strong>Short-lived SSO credentials</strong> for cluster access - rotated per session, same permissions as the engineer's terminal</li>
<li class=""><strong>Explicit approval gates</strong> for every write - nothing touched the cluster without a human reviewing first</li>
<li class=""><strong>Read-only MCP access</strong> for logs and code - observe everything, change nothing without approval</li>
</ul>
<p>The governance layer isn't friction. It's what makes it safe to give the AI real access to real systems in the first place. Get that right first. Then give it access. In that order.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-setup">The Setup<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#the-setup" class="hash-link" aria-label="Direct link to The Setup" title="Direct link to The Setup" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Claude Code System Setup" src="https://architecture.learning.sap.com/assets/images/setup-diagram-d288a1db05a78df69337be4feffbf886.webp" width="1104" height="1136" class="img_ev3q"></p>
<p><strong>GitHub MCP server</strong> - full repo read access. Claude Code traced imports, followed call chains, read any file without being handed anything manually.</p>
<p><strong>Kubernetes context</strong> - kubectl from the shell session, short-lived SSO token from our Gardener cluster, same permissions as the engineer's terminal. Every write operation required explicit approval. Reads ran uninterrupted.</p>
<p>We run on Gardener - SAP's opinionated Kubernetes distribution with its own concepts (shoot clusters, seed clusters, gardenlets). Claude Code doesn't know Gardener out of the box. We dropped a documentation link into the session. It read it and reasoned correctly from there. General rule: if your infrastructure deviates from vanilla, hand it the docs.</p>
<p><strong>Memory on by default</strong> via <code>.claude/</code> in the repo root. Findings carried across sessions - no re-running tests already run, no re-reading files already understood.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-actually-made-it-work">What Actually Made It Work<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#what-actually-made-it-work" class="hash-link" aria-label="Direct link to What Actually Made It Work" title="Direct link to What Actually Made It Work" translate="no">​</a></h2>
<p><strong>The plan came first.</strong> Before any code was written or command run, Claude Code produced a plan - hypotheses, layers to eliminate, sequence to follow. We reviewed it and pushed back on assumptions that didn't match how the system actually behaves at runtime. That review was the highest-leverage moment in the session. A wrong plan executed fast still produces the wrong result. A few minutes challenging the plan saved hours of misdirected work.</p>
<p><strong>We kept correcting it mid-investigation.</strong> Claude Code made assumptions about startup sequence, which environment variables were authoritative, what test results implied. Several were wrong. Saying "that's not how this works" changed direction immediately. It doesn't defend wrong assumptions - it incorporates corrections and re-traces. Human operational knowledge combined with AI tracing is what got there in 60 minutes. Neither alone would have.</p>
<p><strong>We gave it operational context, not just code.</strong> Claude Code reads code structure. It can't know runtime behavior - deployment order, environment injection timing, what actually happens when the pod starts. Telling it "this variable comes from the K8s secret, not the code" cut entire categories of wrong hypotheses before they started. Think of it as onboarding a very fast engineer who has read all the code but never run the system.</p>
<p><strong>No context-switching penalty.</strong> This is the real reason it's fast. A human loses the mental model a little every time they switch between files, log streams, and components. Rebuilding it costs minutes each time and compounds over hours. Claude Code held the full startup sequence, token cache state, log timestamps, and test results in context simultaneously for the entire session. It wasn't faster because it worked in parallel. It was faster because it never lost the thread.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-what--patterns-you-can-apply-today">So What? — Patterns You Can Apply Today<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#so-what--patterns-you-can-apply-today" class="hash-link" aria-label="Direct link to So What? — Patterns You Can Apply Today" title="Direct link to So What? — Patterns You Can Apply Today" translate="no">​</a></h2>
<p>This wasn't just about one bug. Here's what engineers should take away:</p>
<ol>
<li class="">
<p><strong>SDK credential priority matters.</strong> Any SDK that supports multiple credential sources (env vars, files, service keys) has a resolution order. Know it. Document it. Add startup validation that fails fast if conflicting credentials are detected.</p>
</li>
<li class="">
<p><strong>Test startup, not just functions.</strong> Unit tests that call <code>init()</code> directly don't catch prewarm race conditions. Write integration tests that mimic actual container startup sequence.</p>
</li>
<li class="">
<p><strong>HTTP 400 ≠ bad request body.</strong> In multi-tenant OAuth systems, 400 often means "valid request, wrong context." Decode the JWT, check the issuer/audience, compare to the endpoint you're calling.</p>
</li>
<li class="">
<p><strong>AI debugging works best with full context.</strong> Don't feed the AI one file at a time. Give it the error, logs, and codebase access simultaneously. The bug is often in the gap between components.</p>
</li>
<li class="">
<p><strong>Human operational knowledge is irreplaceable.</strong> AI can trace code and correlate logs. It can't know that your K8s secrets get injected after container start, or that prewarm runs before init. Tell it.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it">Try It<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#try-it" class="hash-link" aria-label="Direct link to Try It" title="Direct link to Try It" translate="no">​</a></h2>
<p>If you have a bug that only shows up in the full system flow - give Claude Code the error, the logs, and codebase access together, not sequentially. Ask it to correlate timestamps, trace from startup to failure, use process of elimination.</p>
<p>Tell it to generate tests that reproduce the failure condition, not just unit tests for individual functions.</p>
<p>Review the plan it produces before you let it run. Push back on anything that doesn't match how your system behaves at runtime. Give it the operational context it can't get from reading code alone - deployment sequence, environment assumptions, how you actually test things.</p>
<p>Set up MCP access. Use short-lived credentials. Gate writes behind approval. Enable memory. Hand it docs for anything non-vanilla.</p>
<p>Then watch it curl through logs, write and validate tests and re-direct it when needed (i.e. provide more context) while sipping your coffee….</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-claude-code-skill---reusable-debugging-pattern">The Claude Code Skill - Reusable Debugging Pattern<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#the-claude-code-skill---reusable-debugging-pattern" class="hash-link" aria-label="Direct link to The Claude Code Skill - Reusable Debugging Pattern" title="Direct link to The Claude Code Skill - Reusable Debugging Pattern" translate="no">​</a></h2>
<p>We've encoded the hard-won patterns from this debugging session into a reusable Claude Code skill. Drop this into your <code>.claude/commands/</code> directory and invoke it whenever you hit an HTTP 400 in any authenticated distributed system.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>debug-http400.md</strong> - Click to expand</summary><div><div class="collapsibleContent_i85q"><div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#9CDCFE"><span class="token front-matter-block punctuation" style="color:rgb(212, 212, 212)">---</span><span class="token front-matter-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token front-matter-block front-matter yaml language-yaml"> debug</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token front-matter-block front-matter yaml language-yaml">http400</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Diagnose HTTP 400 errors in systems that use OAuth tokens</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> service keys</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> API gateways</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> or multi</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token front-matter-block front-matter yaml language-yaml">provider credential configs. Goes beyond "bad request" — encodes hard</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token front-matter-block front-matter yaml language-yaml">won patterns where 400 is caused by correct</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token front-matter-block front-matter yaml language-yaml">but</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token front-matter-block front-matter yaml language-yaml">wrong</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token front-matter-block front-matter yaml language-yaml">environment tokens</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> credential mixing</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> proxy masking</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> and startup auth race conditions.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule">argument-hint</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token front-matter-block front-matter yaml language-yaml">error message</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> endpoint</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token front-matter-block front-matter yaml language-yaml"> or affected component</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token front-matter-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:rgb(212, 212, 212)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">You are debugging an HTTP 400 error. The context is: $ARGUMENTS</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">HTTP 400 in authenticated distributed systems almost never means "malformed request body".</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">It usually means </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">the request is structurally valid but contextually wrong</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"> — wrong environment,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">wrong token, wrong endpoint, mixed credentials. Work through every phase below.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token hr punctuation" style="color:rgb(212, 212, 212)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 1: Establish What 400 Actually Means Here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">First, determine which layer is returning the 400:</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">Your own validation code</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"> — a required field is missing or wrong type</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">An API gateway / proxy</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"> — the gateway rejected it before it reached the upstream service</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">The upstream service itself</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"> — the service received the request but rejected it</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">An auth server</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"> — the token request itself returned 400 (malformed grant, wrong client_id)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">How to tell:</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Check response headers for gateway fingerprints (</span><span class="token code-snippet code keyword" style="color:rgb(86, 156, 214)">`x-envoy`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:rgb(86, 156, 214)">`x-kong`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:rgb(86, 156, 214)">`via`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:rgb(86, 156, 214)">`x-request-id`</span><span class="token plain"> patterns)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Check if the response body is HTML or a generic error page (proxy) vs structured JSON (service)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Check if the 400 comes back instantly (proxy reject) or after a round-trip delay (service reject)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Check whether the same request works against the service directly (bypassing the gateway)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">If it is a gateway/proxy 400:</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"> the upstream error is being masked. The real error is likely a</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">401 or 403 that the proxy is converting. Do not debug the request body — debug the token.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token hr punctuation" style="color:rgb(212, 212, 212)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 2: Read All Credential and Config Code First</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Before forming hypotheses, read the entire credential resolution path:</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> How are credentials loaded? (env vars, JSON service key, file mount, secret store)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Is there a priority order? Which credential source wins when multiple are present?</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Is there any startup / prewarm code that fetches and caches a token early?</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Are tokens cached in memory? What is the TTL? When is the cache invalidated?</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Are there multiple credential sets (staging + prod, service A + service B) that could coexist?</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Read ALL config/secret files that could be active — not just the one you think is in use.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token hr punctuation" style="color:rgb(212, 212, 212)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 3: Fan Out — All HTTP 400 Hypotheses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Generate all plausible causes before investigating any single one:</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">###</span><span class="token title important"> 🔑 Credential &amp; Token Hypotheses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H1 — Token from wrong environment</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Token is valid and well-formed, but was issued by staging auth and sent to prod endpoint (or vice versa).</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H2 — Credential mixing: composite key + individual vars coexist</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">A service key JSON (composite) and individual auth vars are both present. The SDK resolves them in a fixed priority order.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H3 — Prewarm auth race: token cached before config is fully loaded</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Auth is fetched eagerly at startup before env vars are fully set.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H4 — Wrong OAuth grant type or missing parameter</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">The token request itself returns 400.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H5 — Expired or revoked token sent</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Token was valid when cached, expired server-side before local TTL.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">###</span><span class="token title important"> 🌐 Gateway &amp; Proxy Hypotheses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H6 — Enterprise proxy is masking the real error</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Proxies sometimes convert upstream 401/403 into 400.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H7 — Wrong base URL: request routed to wrong environment</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H8 — Missing or malformed required header</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">###</span><span class="token title important"> 📦 Request Body Hypotheses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H9 — Body encoding or content-type mismatch</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token bold content">H10 — Payload too large or silently truncated upstream</span><span class="token bold punctuation" style="color:rgb(212, 212, 212)">**</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token hr punctuation" style="color:rgb(212, 212, 212)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 4: Eliminate in Parallel</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">For each hypothesis, gather evidence that confirms or rules it out.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 5: Root Cause Statement</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Write out what exactly triggers the 400 and why it returns 400 instead of 401/403.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 6: Fix with Minimal Blast Radius</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Fix only the confirmed root cause. Verify ALL secret/config files.</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(212, 212, 212)">##</span><span class="token title important"> Phase 7: Prevent Recurrence</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Add fast-fail validation, cache invalidation, and observability.</span><br></div></code></pre></div></div></div></div></details>
<p><strong>Key insight encoded in this skill:</strong> HTTP 400 in authenticated distributed systems almost never means "malformed request body." It usually means the request is structurally valid but contextually wrong — wrong environment, wrong token, wrong endpoint, mixed credentials. The skill walks through 10 hypotheses in parallel, ensuring you don't get tunnel-visioned on the wrong layer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helpful-links">Helpful Links<a href="https://architecture.learning.sap.com/news/2026/04/23/finding-the-needle-ai-assisted-debugging#helpful-links" class="hash-link" aria-label="Direct link to Helpful Links" title="Direct link to Helpful Links" translate="no">​</a></h2>
<p><strong>This Post:</strong></p>
<ul>
<li class=""><a href="https://medium.com/@anujag24/finding-the-needle-ai-assisted-debugging-across-thousands-of-lines-and-megabytes-of-logs-601e04bfb79e" target="_blank" rel="noopener noreferrer" class="">Read on Medium</a> - Shortened version with discussion</li>
</ul>
<p><strong>Claude Code &amp; MCP:</strong></p>
<ul>
<li class=""><a href="https://docs.anthropic.com/en/docs/claude-code" target="_blank" rel="noopener noreferrer" class="">Claude Code Documentation</a> - Official guide</li>
<li class=""><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol (MCP)</a> - The protocol that enables Claude Code to access external tools and data</li>
<li class=""><a href="https://github.com/modelcontextprotocol/servers" target="_blank" rel="noopener noreferrer" class="">MCP Servers Directory</a> - Pre-built MCP servers for GitHub, Kubernetes, databases, and more</li>
<li class=""><a href="https://docs.anthropic.com/en/docs/claude-code/memory#project-specific-commands" target="_blank" rel="noopener noreferrer" class="">Claude Code Skills/Commands</a> - How to create reusable skills like the one above</li>
</ul>
<p><strong>SAP-Specific:</strong></p>
<ul>
<li class=""><a href="https://help.sap.com/docs/sap-ai-core" target="_blank" rel="noopener noreferrer" class="">SAP AI Core Documentation</a> - Official SAP AI Core guides</li>
<li class=""><a href="https://pypi.org/project/generative-ai-hub-sdk/" target="_blank" rel="noopener noreferrer" class="">SAP AI SDK for Python</a> - The SDK with the credential resolution logic discussed</li>
<li class=""><a href="https://www.sap.com/products/technology-platform.html" target="_blank" rel="noopener noreferrer" class="">SAP Business Technology Platform (BTP)</a> - SAP's enterprise cloud platform</li>
<li class=""><a href="https://gardener.cloud/" target="_blank" rel="noopener noreferrer" class="">Gardener</a> - Kubernetes-as-a-Service for multi-cloud environments</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing the refreshed SAP Architecture Center: A Fresher Experience for Enterprise Architects]]></title>
            <link>https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center</link>
            <guid>https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover the refreshed SAP Architecture Center featuring a modern interface, 30 reference architectures across 88 documents, enhanced community contributions, and improved search capabilities.]]></description>
            <content:encoded><![CDATA[<p>We are pleased to announce the launch of a refreshed SAP Architecture Center. After weeks of development and community feedback, we have reimagined the platform to deliver a more engaging, intuitive, and powerful experience for architects, developers, and SAP professionals worldwide.</p>
<p><img decoding="async" loading="lazy" alt="Architecture Center NEO" src="https://architecture.learning.sap.com/assets/images/AC3.0-ba1474233948cbd4651a2f2d591b8345.webp" width="2992" height="1700" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-broader-mission-for-a-changing-landscape">A Broader Mission for a Changing Landscape<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#a-broader-mission-for-a-changing-landscape" class="hash-link" aria-label="Direct link to A Broader Mission for a Changing Landscape" title="Direct link to A Broader Mission for a Changing Landscape" translate="no">​</a></h2>
<p>Beyond the visual redesign, the SAP Architecture Center is evolving to reflect a fundamental shift in both our industry and SAP's strategic direction. The pace of technological change, particularly with AI, cloud transformation, and evolving enterprise needs, requires a more dynamic and transparent approach to architectural guidance.</p>
<p>Our mandate has expanded. The Architecture Center is no longer simply a repository of reference architectures. It has become a communication channel between SAP's architectural vision and the global community of practitioners implementing these solutions. We are committed to bringing greater transparency to our work, sharing not just finished architectures but also insights into what we are currently developing, the challenges we are addressing, new research initiatives, and the strategic directions we are pursuing.</p>
<p>This shift recognises that architecture is a continuous conversation, not a set of static documents. As the industry evolves and SAP's strategy adapts to new market realities, the Architecture Center will serve as a living platform where these changes are communicated clearly, openly, and in a way that helps you make informed decisions about your own architectural choices.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="comprehensive-reference-architectures">Comprehensive Reference Architectures<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#comprehensive-reference-architectures" class="hash-link" aria-label="Direct link to Comprehensive Reference Architectures" title="Direct link to Comprehensive Reference Architectures" translate="no">​</a></h2>
<p>The platform now hosts <strong>30</strong> reference architectures across <strong>104</strong> unique documents, and the external version of the <a class="" href="https://architecture.learning.sap.com/docs/aigp">AI Golden Path</a>. Each architecture provides detailed guidance on integrating SAP solutions with cloud providers and technology partners.</p>
<p>Recent additions include practical implementations for:</p>
<ul>
<li class=""><a class="" href="https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e"><strong>Agentic AI &amp; AI Agents</strong></a> covering how to build, integrate and orchestrate AI agents on SAP BTP using low-code approaches with Joule Studio, pro-code development with SAP Cloud SDK for AI, and Agent2Agent (A2A) interoperability.</li>
<li class=""><a class="" href="https://architecture.learning.sap.com/docs/ref-arch/06ff6062dc"><strong>Integrating and Extending Joule</strong></a> exploring enterprise integration with SAP S/4HANA and SAP SuccessFactors, building custom skills and agents with Joule Studio, and extending Joule's capabilities across your landscape.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-driven-content">Community-Driven Content<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#community-driven-content" class="hash-link" aria-label="Direct link to Community-Driven Content" title="Direct link to Community-Driven Content" translate="no">​</a></h2>
<p>One of our core principles remains unchanged: the SAP Architecture Center thrives because of community contributions. The new Quick Start (coming soon) will make it easier than ever to contribute your expertise through an enhanced GitHub-based workflow. We have refined the contributor experience with better documentation, clearer guidelines, and streamlined processes for submitting new architectures or enhancing existing ones.</p>
<p>Our community section now provides comprehensive guides for getting started, including Visual Studio Code integration, architecture modelling guidelines, and best practices for creating diagrams and documentation. Whether you are proposing your first reference architecture or refining an existing one, the path forward is clearer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-means-for-you">What This Means for You<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#what-this-means-for-you" class="hash-link" aria-label="Direct link to What This Means for You" title="Direct link to What This Means for You" translate="no">​</a></h2>
<p>Whether you are designing a new SAP integration, planning a cloud migration, or exploring how to implement AI capabilities in your enterprise applications, the new SAP Architecture Center provides:</p>
<ul>
<li class="">Clear, actionable guidance based on real-world implementations</li>
<li class="">Detailed architectural patterns with diagrams and code samples</li>
<li class="">Integration strategies for SAP products with hyperscaler services</li>
<li class="">Best practices from SAP experts and community contributors</li>
<li class="">Regular updates reflecting the latest SAP innovations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-forward">Looking Forward<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#looking-forward" class="hash-link" aria-label="Direct link to Looking Forward" title="Direct link to Looking Forward" translate="no">​</a></h2>
<p>This release represents a significant milestone, but it is just the beginning. As part of our expanded mandate, we are committed to bringing greater transparency to our architectural work. You will see more frequent updates about emerging patterns, work-in-progress architectures, and strategic initiatives we are exploring. The Architecture Center will serve as your window into how SAP is thinking about and addressing the architectural challenges facing modern enterprises.</p>
<p>We are committed to continuously improving the platform based on your feedback and contributions. The SAP Architecture Center will continue to evolve as a living resource that grows with the SAP ecosystem, reflecting both the rapid pace of technological change and our evolving strategy.</p>
<p>We encourage you to explore the new platform, discover reference architectures relevant to your work, and consider joining our Community of Practice. Your expertise and real-world experience make this resource valuable for the entire SAP community. Through this enhanced transparency, we aim to create a stronger connection between SAP's architectural direction and the practical needs of the professionals implementing these solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-involved">Get Involved<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>The SAP Architecture Center is open source and welcomes contributions from architects, developers, and SAP professionals worldwide. Visit our <a href="https://architecture.learning.sap.com/community/intro" target="_blank" rel="noopener noreferrer" class="">Community of Practice</a> page to learn how you can:</p>
<ul>
<li class="">Contribute new reference architectures</li>
<li class="">Enhance existing documentation</li>
<li class="">Share implementation experiences</li>
<li class="">Participate in discussions (via SAP Community)</li>
<li class="">Help shape the future of SAP architecture guidance</li>
</ul>
<p>Thank you to all the contributors who have made this release possible. Your dedication to sharing knowledge and best practices benefits the entire SAP community and helps organisations worldwide build better solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="celebrating-community-contributions">Celebrating Community Contributions<a href="https://architecture.learning.sap.com/news/2026/04/22/introducing-the-refreshed-sap-architecture-center#celebrating-community-contributions" class="hash-link" aria-label="Direct link to Celebrating Community Contributions" title="Direct link to Celebrating Community Contributions" translate="no">​</a></h2>
<p>We would like to highlight the contributions from our community partners who have enriched the Architecture Center with their real-world expertise. These contributions demonstrate the power of collaborative knowledge-sharing and bring valuable practitioner insights to our growing library of reference architectures.</p>
<p>We extend our sincere thanks to <strong>Fortinet</strong> for contributing <a class="" href="https://architecture.learning.sap.com/docs/ref-arch/d6e703646d">Log-Driven Security Operations with SAP Enterprise Threat Detection and SIEM/SOAR Platforms</a>, and to <a href="https://github.com/randomstr1ng" target="_blank" rel="noopener noreferrer" class="">@randomstr1ng</a> for authoring this comprehensive security architecture that bridges SAP-native threat detection with enterprise security operations.</p>
<p>Our appreciation goes to <strong>SD Worx</strong> for sharing <a class="" href="https://architecture.learning.sap.com/docs/ref-arch/5Hlvofqg">SAP SuccessFactors Suite</a>, and to <a href="https://github.com/arjenvanhooydonk" target="_blank" rel="noopener noreferrer" class="">@arjenvanhooydonk</a> for creating this detailed overview of the SuccessFactors ecosystem that helps organisations understand the full employee lifecycle platform.</p>
<p>We are grateful to <strong>Glencore</strong> for contributing <a class="" href="https://architecture.learning.sap.com/docs/ref-arch/9a5f7b59dc">Transitioning Architectures from SAP NetWeaver</a>, and to <a href="https://github.com/abklgithub" target="_blank" rel="noopener noreferrer" class="">@abklgithub</a> for providing this essential guidance on navigating the transition from NetWeaver-based products as they approach end-of-maintenance in 2027.</p>
<p>These contributions exemplify the collaborative spirit that makes the SAP Architecture Center a truly community-driven resource. We invite more partners and practitioners to share their architectural insights and help shape the future of enterprise architecture guidance.</p>
<p>We look forward to building the future of SAP architecture together.</p>
<hr>
<p>The entire platform is available as open source at <a href="https://github.com/SAP/architecture-center" target="_blank" rel="noopener noreferrer" class="">github.com/SAP/architecture-center</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Swiss Robotics Company ANYbotics and SAP Are Turning Dirty, Dusty, and Dangerous Industrial Inspections into Business Insights]]></title>
            <link>https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights</link>
            <guid>https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights</guid>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In some of the world’s most dangerous industrial environments, including oil refineries, offshore wind platforms, cement plants, and chemical facilities, human access is often limited, risky, or prohibitively expensive.]]></description>
            <content:encoded><![CDATA[<p>In some of the world’s most dangerous industrial environments, including oil refineries, offshore wind platforms, cement plants, and chemical facilities, human access is often limited, risky, or prohibitively expensive.</p>
<p>ANYbotics, a Swiss robotics company, has stepped into this space with a vision to shape a safer future for industrial inspection, one where robots operate as autonomous members of the inspection team, running inspection operations integrated into plant maintenance workflows.</p>
<p>This vision is embodied in the company’s “ANYmal”: a four-legged inspection robot designed specifically for heavy industry.</p>
<p><img decoding="async" loading="lazy" alt="ANYbotics industrial inspections" src="https://architecture.learning.sap.com/assets/images/ANY_25_11-AnyMal-North-Star-Bluescope-94-1920x600-6379837b9ff73c4e95938db06ed109fb.jpg" width="1920" height="600" class="img_ev3q"></p>
<p>Unlike general-purpose robotics platforms, ANYmal is engineered to operate in “big, dirty, dusty, and dangerous” environments, says Nicole Zingg, director of Technology Partnerships at ANYbotics. Places where stairs, corrosion, heat, and unreliable connectivity are the norm, not the exception.</p>
<p>But hardware, Zingg says, is only one part of the puzzle that makes ANYmal indispensable to customers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="inspection-robotics-is-about-data">Inspection robotics is about data<a href="https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights#inspection-robotics-is-about-data" class="hash-link" aria-label="Direct link to Inspection robotics is about data" title="Direct link to Inspection robotics is about data" translate="no">​</a></h3>
<p>“We build a hardware platform,” Zingg explains, “but inspection robotics is really about data that is consistent and trustworthy.”</p>
<p>ANYmal autonomously navigates industrial sites to collect data that goes beyond what a human can collect alone. Beyond just visual inspection, its sensors also collect multi-modal data, including thermal imaging, ultrasonic leak detection, gas concentration detection, acoustic anomaly detection, and more. The observations are fed into what ANYbotics calls “inspection intelligence,” which transforms the collected data into actionable operational insights. The result is higher uptime, longer asset lifecycles, and, most importantly, safer working conditions for humans.</p>
<p>ANYmal can make a huge impact on operations. One offshore wind customer, Zingg says, has used ANYmal to manage all inspections and has eliminated the need to send personnel to a remote platform for months. When human intervention was eventually required, ANYmal’s data from prior inspections made all the difference. The customer already knew exactly what was wrong, which expert to send, and what equipment to bring—avoiding costly and risky trial-and-error site visits.</p>
<p>Yet for ANYbotics, delivering insights is not enough if those insights are not integrated in the software systems customers use.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sap-is-where-anybotics-needs-to-be-native">“SAP is where ANYbotics needs to be native”<a href="https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights#sap-is-where-anybotics-needs-to-be-native" class="hash-link" aria-label="Direct link to “SAP is where ANYbotics needs to be native”" title="Direct link to “SAP is where ANYbotics needs to be native”" translate="no">​</a></h3>
<p>Through extensive user research, ANYbotics discovered that many plant operators, maintenance managers, and field service teams already run their daily operations in SAP. Work orders, asset histories, performance trends, and decisions all flow through SAP systems. “If customers are using SAP, SAP is where ANYbotics needs to be native,” Zingg says.</p>
<p>Meanwhile, SAP’s Project Embodied AI was looking for robotics companies to partner with. The project focuses on extending the impact of SAP Business AI into physical operations by enabling robots to autonomously perform complex tasks with an understanding of the broader business context.</p>
<p>It was clearly a perfect fit and has delivered advantages for both companies.</p>
<p>On the system side, a continuous, unbroken digital thread connects ANYbotics insights from industrial inspections to data in SAP systems, helping inform key business and operational decisions across the organization.</p>
<p>For end users, embedding ANYmal directly into familiar SAP workflows can also help ease adoption, since introducing robotics into already stretched industrial workforces can trigger anxiety. Concerns about job security, workflow disruption, and complexity are common, but embedding ANYmal directly into familiar SAP workflows can help reduce that friction, Zingg explains.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="treating-robots-as-part-of-the-workforce">Treating robots as part of the workforce<a href="https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights#treating-robots-as-part-of-the-workforce" class="hash-link" aria-label="Direct link to Treating robots as part of the workforce" title="Direct link to Treating robots as part of the workforce" translate="no">​</a></h3>
<p>The first major integration point was SAP Field Service Management. Rather than sending only human technicians, customers can now dispatch work orders directly to ANYmal as they would to any other field team member. The robot then autonomously executes inspection tasks, gathers data, and reports the results directly back into a company’s SAP system.</p>
<p>From there, the integration expanded into asset-related scenarios and is now moving toward broader enablement via SAP Business Technology Platform (SAP BTP), with the goal of allowing robot-generated data to land wherever customers need it in their SAP landscape.</p>
<p>The ambition is not to force humans to adapt to robots, but for robots to adapt to human workflows. “ANYmal has to put data in the SAP system, just like human team members,” Zingg notes. ANYmal becomes another worker in the same operational system of record.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-embodied-ai-in-practice">Project Embodied AI in practice<a href="https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights#project-embodied-ai-in-practice" class="hash-link" aria-label="Direct link to Project Embodied AI in practice" title="Direct link to Project Embodied AI in practice" translate="no">​</a></h3>
<p>This combination of ANYbotics robotic technology with SAP bridges the gap between physical operations and enterprise applications and tangibly reflects the goal of Project Embodied AI.</p>
<p>On the SAP side, AI agents operate on ANYmal’s robotic systems to execute physical tasks, such as safety inspections.</p>
<p>On the ANYbotics side, ANYmal is a physical object that moves through space, perceives its environment, and acts within real-world constraints. ANYmal uses SAP historic and time-series data to inform decisions while at the same time remaining fully autonomous even in environments with no connectivity.</p>
<p>It’s important to note, Zingg stresses, that ANYbotics has control over ANYmal’s behavior and inspection execution, while SAP has control over the business context such as work orders, asset data, or operational priorities. It is the SAP business context that informs how ANYmal’s insights are consumed and acted upon while ANYbotics controls ANYmal’s physical interactions.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scaling-safely-and-responsibly">Scaling safely and responsibly<a href="https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights#scaling-safely-and-responsibly" class="hash-link" aria-label="Direct link to Scaling safely and responsibly" title="Direct link to Scaling safely and responsibly" translate="no">​</a></h3>
<p>Today, more than 200 ANYmal robots are already in productive use worldwide, with inspection deployments in heavy-industry environments that would otherwise require constant human exposure.</p>
<p>Safety remains central to ANYbotics. Each deployment includes extensive testing and an on-site field engineer who helps ANYmal learn and validate its environment and trains customer teams on safe operational procedures. While ANYmal is built to work independently, humans remain firmly in the loop.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-glimpse-into-the-future">A glimpse into the future<a href="https://architecture.learning.sap.com/news/2026/03/30/anybotics-industrial-inspections-into-business-insights#a-glimpse-into-the-future" class="hash-link" aria-label="Direct link to A glimpse into the future" title="Direct link to A glimpse into the future" translate="no">​</a></h3>
<p>As industries face labor shortages and aging workforces, undocumented expertise can all too often be lost. With autonomous inspection robots such as ANYmal, this knowledge is captured and turned into programs that can run day in and day out across multiple sites. The captured data flows into SAP to become organizational intelligence that survives any workforce turnover.</p>
<p>ANYbotics’ partnership with SAP shows that this combination of robotics and enterprise software is moving swiftly from the experimental stage to real-world implementation.</p>
<p>In the future, industrial inspection will be powered by AI, not as disembodied dashboards or isolated machines, but as an integrated intelligent system where physical robots and digital workflows in SAP systems operate as one.</p>
<p>In that future, robots like ANYmal are no longer novelties. They are coworkers, albeit mechanical four-legged ones, quietly extending human capability into places humans were never meant to go. These robots, together with SAP, are shaping for a future where dirty, dangerous, and dusty industrial inspections are being transformed into business insights.</p>
<p>Alexa MacDonald</p>
<hr>
<p>Top image courtesy of ANYbotics</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Architectures & Contributors (Q4-2025)]]></title>
            <link>https://architecture.learning.sap.com/news/2026/01/23/whats-new-in-sap-architecture-center</link>
            <guid>https://architecture.learning.sap.com/news/2026/01/23/whats-new-in-sap-architecture-center</guid>
            <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Explore new reference architectures covering Embodied AI Agents, SAP Business Data Cloud, Joule extensions, and Event-Driven Applications. Meet the latest contributors to the SAP Architecture Center.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-the-sap-architecture-center">What's New in the SAP Architecture Center<a href="https://architecture.learning.sap.com/news/2026/01/23/whats-new-in-sap-architecture-center#whats-new-in-the-sap-architecture-center" class="hash-link" aria-label="Direct link to What's New in the SAP Architecture Center" title="Direct link to What's New in the SAP Architecture Center" translate="no">​</a></h2>
<p>Welcome to our Q4-2025 quarterly update for the SAP Architecture Center! This quarter was all about AI—from a brand new Embodied AI Agents architecture to expanded Joule guidance covering everything from S/4HANA integration to building custom AI agents. We also added practical content on event-driven patterns and data integration.</p>
<p>We hope you find this list useful and join us in thanking our contributors for their efforts in building the SAP Architecture Center together.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="featured-reference-architecture">Featured Reference Architecture<a href="https://architecture.learning.sap.com/news/2026/01/23/whats-new-in-sap-architecture-center#featured-reference-architecture" class="hash-link" aria-label="Direct link to Featured Reference Architecture" title="Direct link to Featured Reference Architecture" translate="no">​</a></h3>
<p>This quarter brings a new top-level reference architecture that bridges AI and robotics—showing how intelligent agents can operate in the physical world:</p>
<ul>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/083f2d968e" target="_blank" rel="noopener noreferrer" class="">Embodied AI Agents</a></strong> - Discover how to build and deploy Embodied AI Agents that interact with physical environments. This architecture explores the integration of AI capabilities with robotics and IoT systems for innovative enterprise applications.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reference-architectures-with-new-content">Reference Architectures with New Content<a href="https://architecture.learning.sap.com/news/2026/01/23/whats-new-in-sap-architecture-center#reference-architectures-with-new-content" class="hash-link" aria-label="Direct link to Reference Architectures with New Content" title="Direct link to Reference Architectures with New Content" translate="no">​</a></h3>
<p>We've expanded existing reference architectures with significant new content, providing deeper insights across data management, AI, and integration topics:</p>
<ul>
<li class="">
<p><strong>Integrating and Extending Joule</strong></p>
<ul>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/06ff6062dc/1" target="_blank" rel="noopener noreferrer" class="">Joule in SAP S/4HANA Cloud</a></strong> - Understand how to integrate and leverage Joule AI capabilities within SAP S/4HANA Cloud Private Edition and Public Edition environments.</li>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/06ff6062dc/2" target="_blank" rel="noopener noreferrer" class="">Identity and Access Management for SAP Joule</a></strong> - Implement secure authentication and authorization patterns for SAP Joule across your enterprise landscape.</li>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/06ff6062dc/3" target="_blank" rel="noopener noreferrer" class="">Extend Joule with Joule Studio</a></strong> - Create custom Joule Skills and AI Agents using Joule Studio for seamless integration across SAP and non-SAP systems.</li>
</ul>
</li>
<li class="">
<p><strong>Designing Event-Driven Applications</strong></p>
<ul>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/fbdc46aaae/3" target="_blank" rel="noopener noreferrer" class="">EDA Sample Use Cases</a></strong> - Explore real-world sample use cases demonstrating event-driven architecture patterns with SAP technologies.</li>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/fbdc46aaae/4" target="_blank" rel="noopener noreferrer" class="">SAP CAP Framework for Events to Business Actions Integration</a></strong> - Learn how to use the SAP CAP Framework to build robust events-to-business-actions integrations.</li>
</ul>
</li>
<li class="">
<p><strong>Explore your Hyperscaler data with SAP Business Data Cloud</strong></p>
<ul>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/a07a316077/5" target="_blank" rel="noopener noreferrer" class="">Integration with Snowflake</a></strong> - Connect and integrate Snowflake data sources with SAP Datasphere for comprehensive data analysis.</li>
</ul>
</li>
<li class="">
<p><strong>Transforming Enterprise Data Strategy with SAP Business Data Cloud</strong></p>
<ul>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/f5b6b597a6/6" target="_blank" rel="noopener noreferrer" class="">Unifying Access Across SAP BDC with SAP Cloud Identity Services</a></strong> - Learn how to establish unified identity and access management across SAP Business Data Cloud components using SAP Cloud Identity Services.</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="welcoming-new-contributors">Welcoming New Contributors<a href="https://architecture.learning.sap.com/news/2026/01/23/whats-new-in-sap-architecture-center#welcoming-new-contributors" class="hash-link" aria-label="Direct link to Welcoming New Contributors" title="Direct link to Welcoming New Contributors" translate="no">​</a></h3>
<p>We are thrilled to welcome new contributors who have joined our efforts to expand and enrich the SAP Architecture Center. Their expertise and dedication are invaluable to our community. A big thank you to:</p>
<ul>
<li class=""><a href="https://github.com/adelyafatykhova" target="_blank" rel="noopener noreferrer" class="">adelyafatykhova</a></li>
<li class=""><a href="https://github.com/niklasweidenfeller" target="_blank" rel="noopener noreferrer" class="">niklasweidenfeller</a></li>
<li class=""><a href="https://github.com/guilherme-segantini" target="_blank" rel="noopener noreferrer" class="">guilherme-segantini</a></li>
<li class=""><a href="https://github.com/nagesh-caparthy1" target="_blank" rel="noopener noreferrer" class="">nagesh-caparthy1</a></li>
<li class=""><a href="https://github.com/seeobjectively" target="_blank" rel="noopener noreferrer" class="">seeobjectively</a></li>
</ul>
<p>We hope you enjoyed reading these details. Please join us in shaping the future of SAP architecture and <a class="" href="https://architecture.learning.sap.com/docs/community/contribution">start contributing</a> today!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Architectures & Contributors (Q3-2025)]]></title>
            <link>https://architecture.learning.sap.com/news/2025/08/12/whats-new-in-sap-architecture-center</link>
            <guid>https://architecture.learning.sap.com/news/2025/08/12/whats-new-in-sap-architecture-center</guid>
            <pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Explore new reference architectures covering AI, DevOps, Integration, and Security, and meet the latest contributors to the SAP Architecture Center.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-the-sap-architecture-center">What's New in the SAP Architecture Center<a href="https://architecture.learning.sap.com/news/2025/08/12/whats-new-in-sap-architecture-center#whats-new-in-the-sap-architecture-center" class="hash-link" aria-label="Direct link to What's New in the SAP Architecture Center" title="Direct link to What's New in the SAP Architecture Center" translate="no">​</a></h2>
<p>We're excited to share the latest updates and additions to the SAP Architecture Center since our last major release in Q2-2025! Our community has been hard at work expanding the collection of reference architectures and welcoming new contributors along the way. This will be a quarterly recurring post going forward, where we spotlight newly released, updated, or retired content, along with members of the SAP ecosystem who have made their first contribution to our repository. It's also our chance to share some insights about how people are finding our site and repository.</p>
<p>We hope you find this list useful and join us in thanking our contributors for their efforts in building the SAP Architecture Center together.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-reference-architectures">New Reference Architectures<a href="https://architecture.learning.sap.com/news/2025/08/12/whats-new-in-sap-architecture-center#new-reference-architectures" class="hash-link" aria-label="Direct link to New Reference Architectures" title="Direct link to New Reference Architectures" translate="no">​</a></h3>
<p>We've added several new top-level reference architectures to provide even more guidance and best practices for building robust solutions with SAP technologies. Here are the latest additions, from newest to oldest:</p>
<ul>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/06ff6062dc" target="_blank" rel="noopener noreferrer" class="">Extend Joule with Joule Studio</a></strong> - Utilize AI capabilities with Joule Studio in SAP Build. Create custom Joule Skills and AI Agents for seamless integration across SAP and non-SAP systems, driving automation and innovation.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/1c5706feb5" target="_blank" rel="noopener noreferrer" class="">DevOps with SAP BTP</a></strong> - Adopt agile DevOps principles on SAP BTP with cloud services and tools for streamlined application lifecycle management.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/309338f0eb" target="_blank" rel="noopener noreferrer" class="">API Managed Integration</a></strong> - Enable secure, omni-channel API access to business apps with SAP Integration Suite, simplifying governance, security, and API consumption.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/58f6d88e9a" target="_blank" rel="noopener noreferrer" class="">Application to Application Integration</a></strong> - Enable seamless App2App integration with SAP Integration Suite for near real-time transactional data exchange across internal processes.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/61f6a1db63" target="_blank" rel="noopener noreferrer" class="">Business to Business Integration</a></strong> - Optimize B2B integration with SAP Integration Suite for secure, scalable electronic document exchange with trading partners.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/20c6b29b1e" target="_blank" rel="noopener noreferrer" class="">SAP IAM integration with SAP Cloud Identity Services</a></strong> - Design authentication and role management flows for SAP SaaS with SAP Cloud Identity Services.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/99fd0564be" target="_blank" rel="noopener noreferrer" class="">Integrate and Extend with SAP Build Process Automation</a></strong> - Automate processes with SAP Build Process Automation, integrating workflows across SAP and non-SAP systems.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/7adaecbbaf" target="_blank" rel="noopener noreferrer" class="">Connect Business Applications with SAP Master Data Integration</a></strong> - Synchronize and manage business-critical data across SAP and third-party systems using SAP Master Data Integration.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/7e558be8f1" target="_blank" rel="noopener noreferrer" class="">Secure Service Consumption Across Hyperscalers</a></strong> - This architecture outlines a cloud-agnostic approach for securely consuming services offered by hyperscalers from applications running outside their environments.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/c5f6fe6cf1" target="_blank" rel="noopener noreferrer" class="">Business to Government Integration</a></strong> - Streamline compliance with SAP's Business-to-Government Integration for secure electronic document exchange.</p>
</li>
<li class="">
<p><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/0ec83f98fe" target="_blank" rel="noopener noreferrer" class="">Understanding Network Performance in a Multi Regional Solution</a></strong> - Optimize multi-regional cloud solutions with insights into network design, provider usage, and service placement for superior performance.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reference-architectures-with-new-content">Reference Architectures with New Content<a href="https://architecture.learning.sap.com/news/2025/08/12/whats-new-in-sap-architecture-center#reference-architectures-with-new-content" class="hash-link" aria-label="Direct link to Reference Architectures with New Content" title="Direct link to Reference Architectures with New Content" translate="no">​</a></h3>
<p>We've also expanded existing reference architectures with new content, providing deeper insights and broader coverage on key topics:</p>
<ul>
<li class=""><strong>Generative AI on SAP BTP</strong>
<ul>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/e5eb3b9b1d/10" target="_blank" rel="noopener noreferrer" class="">Vibe Coding with Cline and SAP AI Core</a></strong>  - Learn how to set up and use Cline, an autonomous coding agent, with SAP AI Core to accelerate your development workflows.</li>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/e5eb3b9b1d/8" target="_blank" rel="noopener noreferrer" class="">Agent2Agent Interoperability</a></strong> - Enable interoperability between AI agents with Agent2Agent protocol, fostering collaboration across enterprise landscapes.</li>
<li class=""><strong><a href="https://architecture.learning.sap.com/docs/ref-arch/e5eb3b9b1d/9" target="_blank" rel="noopener noreferrer" class="">Partner Models</a></strong> - Benefit from partner models like the IBM Granite foundation model for the increasing demand of generative AI features in business scenarios with emphasis on data security, IP Protection and enterprise-grade governance and compliance.</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="welcoming-new-contributors">Welcoming New Contributors<a href="https://architecture.learning.sap.com/news/2025/08/12/whats-new-in-sap-architecture-center#welcoming-new-contributors" class="hash-link" aria-label="Direct link to Welcoming New Contributors" title="Direct link to Welcoming New Contributors" translate="no">​</a></h3>
<p>We are thrilled to welcome new contributors who have joined our efforts to expand and enrich the SAP Architecture Center. Their expertise and dedication are invaluable to our community. A big thank you to:</p>
<ul>
<li class=""><a href="https://github.com/uklasing" target="_blank" rel="noopener noreferrer" class="">uklasing</a></li>
<li class=""><a href="https://github.com/kshanth" target="_blank" rel="noopener noreferrer" class="">kshanth</a></li>
<li class=""><a href="https://github.com/AjitKP91" target="_blank" rel="noopener noreferrer" class="">AjitKP91</a></li>
<li class=""><a href="https://github.com/avikSap" target="_blank" rel="noopener noreferrer" class="">avikSap</a></li>
<li class=""><a href="https://github.com/alperdedeoglu" target="_blank" rel="noopener noreferrer" class="">alperdedeoglu</a></li>
<li class=""><a href="https://github.com/sapgunnar" target="_blank" rel="noopener noreferrer" class="">sapgunnar</a></li>
<li class=""><a href="https://github.com/bzarske" target="_blank" rel="noopener noreferrer" class="">bzarske</a></li>
<li class=""><a href="https://github.com/maria-kondratyeva" target="_blank" rel="noopener noreferrer" class="">maria-kondratyeva</a></li>
<li class=""><a href="https://github.com/miguelmezamartinez" target="_blank" rel="noopener noreferrer" class="">miguelmezamartinez</a></li>
</ul>
<p>We hope you enjoyed reading these details. Please join us in shaping the future of SAP architecture and <a class="" href="https://architecture.learning.sap.com/docs/community/contribution">start contributing</a> today!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Launching the SAP Architecture Center]]></title>
            <link>https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center</link>
            <guid>https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center</guid>
            <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The SAP Architecture Center centralizes all resources in one place, enabling organizations to maximize cloud capabilities while ensuring that their solutions are secure, resilient, and optimized to their specific requirements.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="launching-the-sap-architecture-center">Launching the SAP Architecture Center<a href="https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center#launching-the-sap-architecture-center" class="hash-link" aria-label="Direct link to Launching the SAP Architecture Center" title="Direct link to Launching the SAP Architecture Center" translate="no">​</a></h2>
<p>I'm pleased to announce that my team at the Office of the CTO, SAP, has officially launched the SAP Architecture Center on the SAP Learning Center.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-did-we-create-it">Why did we create it?<a href="https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center#why-did-we-create-it" class="hash-link" aria-label="Direct link to Why did we create it?" title="Direct link to Why did we create it?" translate="no">​</a></h4>
<p>In the past, we've relied on various tools, ranging from PowerPoint presentations to static websites, for documenting and sharing technical architectures. These methods, however, lacked collaborative authoring capabilities, robust version control, and ease of iterative refinement. To address these limitations, we've transitioned to a modern, collaborative solution using GitHub, a widely recognized platform among developers and architects.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-sap-architecture-center">What is the SAP Architecture Center?<a href="https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center#what-is-the-sap-architecture-center" class="hash-link" aria-label="Direct link to What is the SAP Architecture Center?" title="Direct link to What is the SAP Architecture Center?" translate="no">​</a></h4>
<p>The SAP Architecture Center is a GitHub-based repository designed to enhance how we build, publish, and govern Reference Solution Architectures. Each architecture is managed through Markdown files on <a href="https://github.com/SAP/architecture-center" target="_blank" rel="noopener noreferrer" class="">GitHub</a>, supporting transparent collaboration, robust version control, and structured governance. Solution diagrams utilize draw.io, an open-source tool, and integrate seamlessly into our official <a href="https://sap.github.io/btp-solution-diagrams/" target="_blank" rel="noopener noreferrer" class="">Solution Diagrams repository</a>, managed by Fabian Lehmann.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-work">How does it work?<a href="https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?" translate="no">​</a></h4>
<ul>
<li class="">Efficient collaboration across teams.</li>
<li class="">Robust version control for architectures.</li>
<li class="">Collective enhancement and evolution of architectures.</li>
<li class="">Structured governance with clear review and approval workflows.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-center-vision">Architecture Center Vision<a href="https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center#architecture-center-vision" class="hash-link" aria-label="Direct link to Architecture Center Vision" title="Direct link to Architecture Center Vision" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="Architecture Center Vision" src="https://architecture.learning.sap.com/assets/images/architecture-center-vision-2cc7290056d22d57b4039bc7eaaa6452.png" width="2100" height="960" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Disclaimer</div><div class="admonitionContent_BuS1"><p>This diagram represents the holistic vision of the SAP Architecture Center, combining both current capabilities and future roadmap elements. Some features are forward-looking and may evolve over time as the platform continues to develop.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://architecture.learning.sap.com/news/2025/05/15/announcing-the-launch-of-sap-architecture-center#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h4>
<p>SAPPHIRE 2025 was our initial launch milestone, marking the start of this journey. Moving forward, we have several strategic enhancements planned:</p>
<ol>
<li class=""><strong>Automated Architecture Validator</strong> with Joule Interface: Solution diagrams will include embedded service metadata, enabling AI-powered automated validation and testing through Joule.</li>
<li class=""><strong>Integration with Learning Journeys</strong>: Enhanced integration with SAP Learning Center Learning Journeys for certifications and accreditations, along with closer alignment with SAP Discovery Center’s service catalog and missions.</li>
<li class=""><strong>Expanded Architectures</strong>: New architectures in data and agentic AI—including open-source collaborations such as A2A interoperability—and additional architectures addressing non-functional requirements like HA/DR, security, and observability.</li>
</ol>
<p>Special acknowledgment to <a href="https://www.linkedin.com/in/philipp-herzig/" target="_blank" rel="noopener noreferrer" class="">Philipp Herzig</a> and <a href="https://www.linkedin.com/in/abechtold/" target="_blank" rel="noopener noreferrer" class="">Andre Bechtold</a> for sponsorship, the core team: <a href="https://www.linkedin.com/in/james-rapp/" target="_blank" rel="noopener noreferrer" class="">James Rapp</a>, <a href="https://www.linkedin.com/in/pierreolivierbasseville/" target="_blank" rel="noopener noreferrer" class="">Pierre-Olivier Basseville</a>, <a href="https://www.linkedin.com/in/navya-khurana-1b78a6187/" target="_blank" rel="noopener noreferrer" class="">Navya Khurana</a>, <a href="https://www.linkedin.com/in/lehmann-fabian/" target="_blank" rel="noopener noreferrer" class="">Fabian Lehmann</a>, <a href="https://www.linkedin.com/in/michael-still-b3aaa2133/" target="_blank" rel="noopener noreferrer" class="">Michael Still</a>, <a href="https://www.linkedin.com/in/marinanoble/" target="_blank" rel="noopener noreferrer" class="">Marina Noble</a>, <a href="https://www.linkedin.com/in/adi-pleyer-5844923/" target="_blank" rel="noopener noreferrer" class="">Adi Pleyer</a>, <a href="https://www.linkedin.com/in/pavankumarpvn/" target="_blank" rel="noopener noreferrer" class="">PVN PavanKumar</a>, <a href="https://www.linkedin.com/in/julian-s-41b9a8253/" target="_blank" rel="noopener noreferrer" class="">Julian Schambeck</a>, <a href="https://www.linkedin.com/in/johannagondi/" target="_blank" rel="noopener noreferrer" class="">Johanna Gonzalez</a>, <a href="https://www.linkedin.com/in/vedant-gupta-ai/" target="_blank" rel="noopener noreferrer" class="">Vedant Gupta</a>, <a href="https://www.linkedin.com/in/gabriel-kevorkian-30005b2/" target="_blank" rel="noopener noreferrer" class="">Gabriel Kevorkian</a>, <a href="https://www.linkedin.com/in/kayschmitteckert/" target="_blank" rel="noopener noreferrer" class="">Kay Schmitteckert</a>, <a href="https://www.linkedin.com/in/robin-purschwitz/" target="_blank" rel="noopener noreferrer" class="">Robin Purschwitz</a>, <a href="https://www.linkedin.com/in/max-lienhardt-a2a157335/" target="_blank" rel="noopener noreferrer" class="">Max Lienhardt</a>, Jonas Mohr, <a href="https://www.linkedin.com/in/praveenkumarpadegal/" target="_blank" rel="noopener noreferrer" class="">Praveen Padegal</a>, and all contributors.</p>
<p>Join us in shaping the future of SAP architecture.</p>
<p><a class="" href="https://architecture.learning.sap.com/docs/community/contribution">Start contributing</a> today!</p>
<p>Anirban
Office of the CTO</p>]]></content:encoded>
        </item>
    </channel>
</rss>