<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Clean-Core on Marian Zeis Blog</title>
    <link>https://blog.zeis.de/tags/clean-core/</link>
    <description>Recent content in Clean-Core on Marian Zeis Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 11 May 2026 09:00:00 +0200</lastBuildDate>
    <atom:link href="https://blog.zeis.de/tags/clean-core/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>From SEGW and Legacy UI5 to RAP with ARC-1</title>
      <link>https://blog.zeis.de/posts/2026-05-11-segw-to-rap/</link>
      <pubDate>Mon, 11 May 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-11-segw-to-rap/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the last posts I introduced &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt;, explained why I built it, showed the BTP architecture, and then used it from Copilot Studio and Joule Studio. Those posts were mostly about architecture and possible use cases.&lt;/p&gt;&#xA;&lt;p&gt;This one is different. This is the use case ARC-1 was originally built for: making real SAP development easier.&lt;/p&gt;&#xA;&lt;p&gt;A lot of SAP customers are still somewhere between old ECC-style custom development and the S/4HANA world they actually want to reach. The uncomfortable part is that &amp;ldquo;moving to S/4&amp;rdquo; can easily become a technical lift and shift. The old custom code moves, the old OData services move, the old UI patterns move, and after the migration the landscape is still not really modern. It just runs somewhere newer.&lt;/p&gt;&#xA;&lt;p&gt;That is not the direction I find interesting. If we already touch those applications, then we should also ask where it makes sense to move them toward RAP, OData V4, Fiori elements, cleaner APIs, and a development model that fits the Clean Core direction much better.&lt;/p&gt;&#xA;&lt;p&gt;So I built a small but complete demo for that:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;a legacy SEGW OData V2 service&lt;/li&gt;&#xA;&lt;li&gt;a legacy freestyle UI5 JavaScript app&lt;/li&gt;&#xA;&lt;li&gt;a new RAP OData V4 service&lt;/li&gt;&#xA;&lt;li&gt;a modern UI5 TypeScript app&lt;/li&gt;&#xA;&lt;li&gt;a Fiori elements app on top of the RAP service&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The full workspace, generated code, ABAP sources, screenshots, and chat logs are published here:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;github.com/arc-mcp/arc-1-segw-to-rap&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-starting-point&#34;&gt;The Starting Point&lt;/h2&gt;&#xA;&lt;p&gt;The demo starts with a small project management application on an S/4HANA 2023 trial system, ABAP Platform 7.58. The legacy backend sits in package &lt;code&gt;ZDEMO_MIG&lt;/code&gt; and uses three custom tables: &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdm_project.tabl.xml&#34;&gt;&lt;code&gt;ZDM_PROJECT&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdm_task.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TASK&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdm_timeentry.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TIMEENTRY&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;On top of that sits the SEGW service &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdemo_mig_projects_srv_0001.iwsg.xml&#34;&gt;&lt;code&gt;ZDEMO_MIG_PROJECTS_SRV&lt;/code&gt;&lt;/a&gt;. It exposes &lt;code&gt;ProjectSet&lt;/code&gt;, &lt;code&gt;TaskSet&lt;/code&gt;, and &lt;code&gt;TimeEntrySet&lt;/code&gt;, with navigation from projects to tasks and from tasks to time entries. The one bit of behavior is the &lt;code&gt;ApproveProject&lt;/code&gt; function import, which changes the project status.&lt;/p&gt;&#xA;&lt;p&gt;This is the old service in SAP Gateway Service Builder. You can see the classic SEGW shape directly: entity types, properties, navigation associations, entity sets, and the function import sitting next to the data model.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;SAP Gateway Service Builder showing the legacy SEGW project service with Project properties, entity sets, associations, and the ApproveProject function import.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/segw-screenshot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The old UI is a classic master/detail app. The left side shows projects, the right side shows the selected project with tasks and time entries. It works, but it also contains the kind of patterns many SAP teams know too well: manual OData V2 model creation, global formatters, synchronous bootstrap, path string parsing, &lt;code&gt;jQuery.sap.require&lt;/code&gt;, manual function import calls, and UI state that is partly stitched together in controller code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Legacy UI5 freestyle app showing the old project master/detail application.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/ui5-legacy-app-screenshot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The backend is similar. The generated &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_mpc.clas.abap&#34;&gt;MPC class&lt;/a&gt; describes the model, and the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_dpc_ext.clas.abap&#34;&gt;DPC_EXT class&lt;/a&gt; contains the custom logic. For the demo I made the legacy code deliberately rough: manual reads, ignored filters in some places, no authority checks, manual navigation handling, and an &lt;code&gt;ApproveProject&lt;/code&gt; function import that updates the project status directly.&lt;/p&gt;&#xA;&lt;p&gt;That is a good migration target because the interesting question is not &amp;ldquo;can an AI write a RAP sample from scratch?&amp;rdquo;. The more useful question is:&lt;/p&gt;&#xA;&lt;p&gt;Can it inspect the old service, understand the contract, and create a modern replacement that keeps the functional shape?&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-skills&#34;&gt;The Skills&lt;/h2&gt;&#xA;&lt;p&gt;For this run I did not just write one big prompt. I used three ARC-1 skills from the maintained &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills&#34;&gt;&lt;code&gt;arc-1/skills&lt;/code&gt;&lt;/a&gt; folder: &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/migrate-segw-to-rap&#34;&gt;&lt;code&gt;migrate-segw-to-rap&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/modernize-ui5-app&#34;&gt;&lt;code&gt;modernize-ui5-app&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/convert-ui5-to-fiori-elements&#34;&gt;&lt;code&gt;convert-ui5-to-fiori-elements&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The folder is worth looking at beyond this demo. It also contains skills for RAP service generation, ABAP test generation, code explanation, custom-code migration, Clean Core checks, documentation, and system-context setup. The idea is that ARC-1 does not only provide tools, but repeatable workflows around those tools.&lt;/p&gt;&#xA;&lt;p&gt;The point of these skills is not that they are perfect generic migration products. They are templates for a process.&lt;/p&gt;&#xA;&lt;p&gt;That distinction matters. The real value is that the skill forces the agent into a structured workflow:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Read the instructions first.&lt;/li&gt;&#xA;&lt;li&gt;Inspect the old system and source code before designing anything.&lt;/li&gt;&#xA;&lt;li&gt;Print the extracted model and plan.&lt;/li&gt;&#xA;&lt;li&gt;Stop for confirmation before writes.&lt;/li&gt;&#xA;&lt;li&gt;Create the new artifacts.&lt;/li&gt;&#xA;&lt;li&gt;Activate, publish, lint, typecheck, and smoke test.&lt;/li&gt;&#xA;&lt;li&gt;Use the feedback from those gates before calling the run done.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This is much closer to how I want agentic SAP development to work. Not &amp;ldquo;please convert my system&amp;rdquo; and hope for the best, but a guided workflow with discovery, constraints, acceptance gates, and real SAP system access.&lt;/p&gt;&#xA;&lt;p&gt;For the run, I used Cursor with Composer-2. I did that intentionally. This was not meant to be a best-case frontier-model demo. It should be closer to what people might actually try in an IDE with a good but not magical model.&lt;/p&gt;&#xA;&lt;p&gt;That is also why the skills matter so much. A detailed skill moves part of the intelligence out of the model and into the workflow: what to read first, when to stop, which tools to use, which checks must pass, and what the target shape should look like. The model still has to reason, but it does not have to invent the whole process from scratch.&lt;/p&gt;&#xA;&lt;p&gt;The MCP setup was split by responsibility. &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; handled the SAP system side: object reads, writes, activation, transports, and service binding work. &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt; gave RAP and CDS documentation context. &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt; and &lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt; were used for the frontend conversion and validation steps.&lt;/p&gt;&#xA;&lt;p&gt;The net execution time for the three guided runs was below 20 minutes. That does not include the time I spent before the final run building the demo, improving the skills, and learning from earlier failed attempts. But for the final guided process itself, this was comfortably under 20 minutes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prompt-1-segw-to-rap&#34;&gt;Prompt 1: SEGW to RAP&lt;/h2&gt;&#xA;&lt;p&gt;The first prompt asked the agent to run the &lt;code&gt;migrate-segw-to-rap&lt;/code&gt; skill against &lt;code&gt;ZDEMO_MIG_PROJECTS_SRV&lt;/code&gt;. The full transcript is in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-1-segw-to-rap&#34;&gt;&lt;code&gt;llm-chat-history/prompt-1-segw-to-rap&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Cursor prompt for the SEGW to RAP run showing ARC-1 reading the legacy service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/starting-prompt-1-segw-to-rap.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The important part is what happened before the agent wrote anything. ARC-1 first probed the system and confirmed the real constraints: ABAP 7.58, RAP availability, transport access, search access, and write access. The agent then tried the obvious generated MPC naming, discovered that this SEGW service used the generated &lt;code&gt;ZCL_ZDEMO_MIG_PROJECTS_*&lt;/code&gt; class names, and read the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_mpc.clas.abap&#34;&gt;MPC class&lt;/a&gt; as the source of the OData model. After that it read the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_dpc_ext.clas.abap&#34;&gt;DPC_EXT class&lt;/a&gt;, because the interesting behavior was not in the metadata. It was in the custom code, especially the &lt;code&gt;ApproveProject&lt;/code&gt; function import.&lt;/p&gt;&#xA;&lt;p&gt;Only after that discovery step did it print the extracted model and stop for &lt;code&gt;ok&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Project&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  key ProjectId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  navigation Tasks&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Task&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  key TaskId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  foreign key ProjectId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  navigation TimeEntries&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TimeEntry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  key EntryId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  foreign keys TaskId, ProjectId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Function import&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ApproveProject(ProjectId) -&amp;gt; Project&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After confirmation, ARC-1 created the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/ABAP_SRC/src/dm&#34;&gt;RAP stack under &lt;code&gt;ABAP_SRC/src/dm&lt;/code&gt;&lt;/a&gt;. This is where the migration becomes interesting on the ABAP side.&lt;/p&gt;&#xA;&lt;p&gt;The root interface view &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_project.ddls.asddls&#34;&gt;&lt;code&gt;ZI_DM_PROJECT&lt;/code&gt;&lt;/a&gt; selects from &lt;code&gt;ZDM_PROJECT&lt;/code&gt; and models tasks as a RAP composition child. The same pattern continues with &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_task.ddls.asddls&#34;&gt;&lt;code&gt;ZI_DM_TASK&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_timeentry.ddls.asddls&#34;&gt;&lt;code&gt;ZI_DM_TIMEENTRY&lt;/code&gt;&lt;/a&gt;. So the old OData navigation model becomes a RAP business object structure instead of staying as manual navigation handling in DPC_EXT.&lt;/p&gt;&#xA;&lt;p&gt;The interface behavior definition &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_project.bdef.asbdef&#34;&gt;&lt;code&gt;ZI_DM_PROJECT&lt;/code&gt;&lt;/a&gt; is managed, uses &lt;code&gt;strict ( 2 )&lt;/code&gt;, and enables draft. It maps the nicer RAP field names like &lt;code&gt;ProjectId&lt;/code&gt;, &lt;code&gt;StartDate&lt;/code&gt;, and &lt;code&gt;EstimatedHours&lt;/code&gt; back to the old table fields like &lt;code&gt;project_id&lt;/code&gt;, &lt;code&gt;start_date&lt;/code&gt;, and &lt;code&gt;estimated_hours&lt;/code&gt;. It also defines the project as the lock master and the child entities as dependent by project. The draft tables &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/rap/zdm_project_d.tabl.xml&#34;&gt;&lt;code&gt;ZDM_PROJECT_D&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/rap/zdm_task_d.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TASK_D&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/rap/zdm_timeentry_d.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TIMEENTRY_D&lt;/code&gt;&lt;/a&gt; are part of that generated target shape.&lt;/p&gt;&#xA;&lt;p&gt;The projection layer then exposes the service-facing model. &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zc_dm_project.ddls.asddls&#34;&gt;&lt;code&gt;ZC_DM_PROJECT&lt;/code&gt;&lt;/a&gt; is a transactional query projection on the interface view, redirects &lt;code&gt;_Tasks&lt;/code&gt; to &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zc_dm_task.ddls.asddls&#34;&gt;&lt;code&gt;ZC_DM_TASK&lt;/code&gt;&lt;/a&gt;, and carries metadata extension support. The projection behavior &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zc_dm_project.bdef.asbdef&#34;&gt;&lt;code&gt;ZC_DM_PROJECT&lt;/code&gt;&lt;/a&gt; reuses create, update, delete, draft actions, and the new approve action from the interface behavior.&lt;/p&gt;&#xA;&lt;p&gt;Finally, the service definition &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zui_dm_projects.srvd.srvdsrv&#34;&gt;&lt;code&gt;ZUI_DM_PROJECTS&lt;/code&gt;&lt;/a&gt; exposes the projection entities as &lt;code&gt;Project&lt;/code&gt;, &lt;code&gt;Task&lt;/code&gt;, and &lt;code&gt;TimeEntry&lt;/code&gt;, and the service binding &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zui_dm_projects_o4.srvb.xml&#34;&gt;&lt;code&gt;ZUI_DM_PROJECTS_O4&lt;/code&gt;&lt;/a&gt; publishes them as OData V4.&lt;/p&gt;&#xA;&lt;p&gt;The new service is OData V4 and published through the service binding:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sap/opu/odata4/sap/zui_dm_projects_o4/srvd/sap/zui_dm_projects_o4/0001/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The old &lt;code&gt;ApproveProject&lt;/code&gt; function import became a RAP action:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-abap&#34; data-lang=&#34;abap&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;approve_project&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zbp_dm_project.clas.locals_imp.abap&#34;&gt;behavior implementation&lt;/a&gt; no longer does a direct &lt;code&gt;UPDATE ... COMMIT WORK&lt;/code&gt; in the old DPC_EXT style. It uses RAP EML in local mode, updates the project status, and lets the RAP runtime handle the transactional context.&lt;/p&gt;&#xA;&lt;p&gt;The logs also show why this is not just text generation. The agent had to deal with real ABAP Platform 7.58 details: where the provider contract belongs, how draft table fields need to be named, which timestamp annotations are available, and how the projection behavior should reuse the interface behavior. These are exactly the details that make a generated RAP example look easy and a real migration annoying.&lt;/p&gt;&#xA;&lt;p&gt;That is the first Clean Core angle of the demo. It does not magically make every old custom object clean. But it moves the service shape away from a SEGW/DPC_EXT implementation and toward a RAP business object, CDS projections, behavior definitions, OData V4, draft support, and metadata-driven UI consumption.&lt;/p&gt;&#xA;&lt;p&gt;For an ECC to S/4HANA journey, this is the kind of direction I would rather see than only lifting old custom services into the new system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prompt-2-ui5-javascript-to-ui5-typescript&#34;&gt;Prompt 2: UI5 JavaScript to UI5 TypeScript&lt;/h2&gt;&#xA;&lt;p&gt;The second prompt converted the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/legacy-ui5-app&#34;&gt;legacy freestyle UI5 JavaScript app&lt;/a&gt; into a &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/modern-ui5-ts-app&#34;&gt;modern UI5 TypeScript app&lt;/a&gt;. The transcript is in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-2-js-to-ts&#34;&gt;&lt;code&gt;llm-chat-history/prompt-2-js-to-ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Cursor prompt for converting the legacy UI5 JavaScript app into UI5 TypeScript.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/starting-prompt-2-ui5-ts.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here the agent did not just rewrite files. The skill forced it to understand the old component setup, manifest, controllers, XML views, formatter logic, model setup, bootstrap, package scripts, and UI5 tooling config before writing the new app.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt; was the guardrail around that work. Before writing code, the agent used it for TypeScript conversion guidance and general UI5 guidelines. That shaped the target app: a real TypeScript scaffold, &lt;code&gt;@sapui5/types&lt;/code&gt;, typed controller events, async loading, manifest-driven models, and no old &lt;code&gt;jQuery.sap.*&lt;/code&gt; patterns. It also created the modern UI5 app scaffold and later ran the UI5 linter and manifest validation. Those checks are important because plain TypeScript compilation does not understand UI5-specific conventions, XML event-handler rules, or manifest schema details.&lt;/p&gt;&#xA;&lt;p&gt;The UI result is mostly relevant here because it proves that the RAP service was usable from a real consumer. The old app talked to &lt;code&gt;/ProjectSet&lt;/code&gt;, followed &lt;code&gt;Tasks&lt;/code&gt;, and called &lt;code&gt;ApproveProject&lt;/code&gt; as an OData V2 function import. The new freestyle app talks to the RAP V4 entity set &lt;code&gt;/Project&lt;/code&gt;, follows &lt;code&gt;_Tasks&lt;/code&gt;, and calls &lt;code&gt;approve_project&lt;/code&gt; as a bound OData V4 operation. The app itself also moved from JavaScript controllers and a manual OData V2 model to TypeScript controllers, manifest-driven OData V4, FlexibleColumnLayout routing, imported formatter modules, and real lint/typecheck gates.&lt;/p&gt;&#xA;&lt;p&gt;The new app consumes the RAP V4 service directly from its &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/modern-ui5-ts-app/webapp/manifest.json&#34;&gt;manifest&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dataSources&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;mainService&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;uri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/sap/opu/odata4/sap/zui_dm_projects_o4/srvd/sap/zui_dm_projects_o4/0001/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;OData&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;odataVersion&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;4.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The action call in the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/modern-ui5-ts-app/webapp/controller/Detail.controller.ts&#34;&gt;detail controller&lt;/a&gt; also changed from the old OData V2 function import style to a bound OData V4 operation:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;operation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bindContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;com.sap.gateway.srvd.zui_dm_projects.v0001.approve_project()&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;operation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;invoke&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$auto&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The UI is still recognizable, but the app is now using a modern runtime and tooling setup.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Modern UI5 TypeScript app consuming the new RAP OData V4 service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/ui5-modern-ts-app-screenshot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This part is important because many real SAP teams cannot immediately replace every freestyle UI5 app with Fiori elements. Sometimes a freestyle app is still the right target. But even then, there is a big difference between old UI5 JavaScript glued to a SEGW V2 service and a modern TypeScript app consuming a RAP V4 service.&lt;/p&gt;&#xA;&lt;p&gt;The run ended with the important gates green: ESLint, UI5 linter, manifest validation, TypeScript typecheck, and a browser render check.&lt;/p&gt;&#xA;&lt;p&gt;That is the second lesson from the logs: the model needed tooling feedback. It was not enough to let it generate code once. The loop with UI5 MCP, linting, manifest validation, and browser verification made the result useful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prompt-3-legacy-ui5-to-fiori-elements&#34;&gt;Prompt 3: Legacy UI5 to Fiori Elements&lt;/h2&gt;&#xA;&lt;p&gt;The third prompt took a different path. Instead of converting the old freestyle app to another freestyle app, it rebuilt the user-facing contract as a &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/modern-fe-app/dm-projects-fe&#34;&gt;Fiori elements V4 list report and object page&lt;/a&gt;. The transcript is in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-3-js-to-fiori-elements&#34;&gt;&lt;code&gt;llm-chat-history/prompt-3-js-to-fiori-elements&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Cursor prompt for converting the legacy UI5 app into a Fiori elements V4 app.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/starting-prompt-3-fiori-elements.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the more interesting Clean Core direction for many S/4HANA projects. A lot of old UI5 code exists because the backend metadata did not carry enough UI intent, or because the old stack made custom frontend code feel like the default. With RAP and Fiori elements, more of the application can move into CDS annotations and behavior.&lt;/p&gt;&#xA;&lt;p&gt;The agent mined the legacy UI for the actual user contract: the columns from the old master list, search behavior, project header fields from the detail view, task table columns, time entry navigation from a selected task, &lt;code&gt;Approve&lt;/code&gt; as a project action, and the status, priority, and date semantics that used to live in the formatter.&lt;/p&gt;&#xA;&lt;p&gt;Then it moved that contract into RAP UI metadata, mainly through the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zme_dm_project.ddlx.asddlxs&#34;&gt;&lt;code&gt;ZME_DM_PROJECT&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zme_dm_task.ddlx.asddlxs&#34;&gt;&lt;code&gt;ZME_DM_TASK&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zme_dm_timeentry.ddlx.asddlxs&#34;&gt;&lt;code&gt;ZME_DM_TIMEENTRY&lt;/code&gt;&lt;/a&gt; metadata extensions. That is where the old UI intent becomes &lt;code&gt;@UI.headerInfo&lt;/code&gt;, line items, selection fields, facets, field groups, presentation variants, search metadata, and semantic keys.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt; had a different role than the UI5 MCP Server. It did not translate freestyle controller code into another set of controllers. It exposed the Fiori tools workflow for an external OData V4 list report and object page: discover the available generation capabilities, inspect the required generator configuration, and shape the app around a project name, target folder, UI5 version, service URL or metadata file, and main entity &lt;code&gt;Project&lt;/code&gt;. In other words, it kept the frontend target inside the standard Fiori elements model instead of letting the conversion drift back into custom page wiring.&lt;/p&gt;&#xA;&lt;p&gt;That also makes the split of responsibility clearer. ARC-1 and SAP Docs MCP helped create and correct the RAP annotations in the ABAP backend. Fiori MCP helped define and generate the Fiori elements application that consumes those annotations through &lt;code&gt;$metadata&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The result is a Fiori elements list report on the RAP &lt;code&gt;Project&lt;/code&gt; entity. The generated app manifest is also in the repo, under &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/modern-fe-app/dm-projects-fe/webapp/manifest.json&#34;&gt;&lt;code&gt;modern-fe-app/dm-projects-fe/webapp/manifest.json&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Fiori elements list report generated from the RAP OData V4 service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/fe-screenshot-1.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;And the object page uses the RAP annotations and navigation model, including general data, audit data, and a tasks table.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Fiori elements object page generated from the RAP OData V4 service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/fe-screenshot-2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the third lesson from the logs: Fiori elements migration is not mainly a JavaScript conversion. It is a relocation of intent.&lt;/p&gt;&#xA;&lt;p&gt;Old freestyle UI5 had the intent spread across controllers, XML views, formatters, routing, and manual binding code. The Fiori elements version moves much of that intent into the RAP service metadata. That is not always the right answer for every app, but when it fits, it is exactly the direction I would prefer for S/4HANA custom apps.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-the-logs-show&#34;&gt;What The Logs Show&lt;/h2&gt;&#xA;&lt;p&gt;I included the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history&#34;&gt;Cursor chat exports&lt;/a&gt; in the repository because I think the transcript is more useful than a polished final result alone.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-1-segw-to-rap&#34;&gt;SEGW to RAP run&lt;/a&gt; has 140 tool records. That is the most important transcript for this post because it shows ARC-1 reading the legacy service, extracting the model from the generated classes, creating the RAP artifacts, activating them, and publishing the service binding. The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-2-js-to-ts&#34;&gt;UI5 TypeScript run&lt;/a&gt; has 142 tool records and is mostly about making the new V4 service usable from a freestyle app. The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-3-js-to-fiori-elements&#34;&gt;Fiori elements run&lt;/a&gt; has 230 tool records because it had to mine the old UI and move more intent into annotations.&lt;/p&gt;&#xA;&lt;p&gt;There are a few patterns that stand out.&lt;/p&gt;&#xA;&lt;p&gt;First, the model needed real SAP context. It did not know the generated class names until ARC-1 searched the system. It did not know the exact service binding shape until ARC-1 read it. It did not know the old &lt;code&gt;ApproveProject&lt;/code&gt; behavior until it inspected the DPC_EXT source.&lt;/p&gt;&#xA;&lt;p&gt;Second, the skills mattered. Without the skills, the model would probably start writing too early. With the skills, it had to read, extract, summarize, stop, then write.&lt;/p&gt;&#xA;&lt;p&gt;Third, the MCP servers had different jobs. &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; was the SAP system bridge. &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt; gave release and documentation context. &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt; and &lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt; grounded the frontend work in current UI5 and Fiori conventions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-is-more-than-a-conversion-demo&#34;&gt;Why This Is More Than A Conversion Demo&lt;/h2&gt;&#xA;&lt;p&gt;The obvious reading of this demo is &amp;ldquo;AI converted old code to new code&amp;rdquo;. That is true, but it is not the main point for me.&lt;/p&gt;&#xA;&lt;p&gt;There are now companies like &lt;a href=&#34;https://www.novaintelligence.com/&#34;&gt;Nova Intelligence&lt;/a&gt; and &lt;a href=&#34;https://www.conduct.ai/&#34;&gt;Conduct&lt;/a&gt; working on SAP custom-code understanding and modernization. I think that is a good signal for the space. My angle here is different: how far can you get with open-source tools, your own AI setup, and MCP servers whose code you can actually inspect?&lt;/p&gt;&#xA;&lt;p&gt;This kind of setup is not as polished as a full commercial SAP modernization platform. But the tradeoff is interesting. ARC-1 is open source, the SAP Docs MCP server is open source, and the UI5 and Fiori MCP servers are open-source SAP tooling. You can see what the tools do, adapt the skills, run the workflow against your own system, and understand why the agent made a decision. For many teams, that transparency matters as much as the raw automation.&lt;/p&gt;&#xA;&lt;p&gt;The more important point is that this is the kind of workflow SAP teams need when they want to move away from lift and shift.&lt;/p&gt;&#xA;&lt;p&gt;In a pure lift-and-shift migration, the old application survives almost unchanged:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SEGW service stays SEGW&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DPC_EXT logic stays DPC_EXT logic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;UI5 JavaScript stays UI5 JavaScript&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OData V2 stays OData V2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;custom UI logic stays custom UI logic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That may be necessary in some places. But if you do that everywhere, the new S/4HANA system inherits most of the old custom development model.&lt;/p&gt;&#xA;&lt;p&gt;In this demo, the target shape is different:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SEGW contract -&amp;gt; RAP business object&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OData V2 -&amp;gt; OData V4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DPC_EXT function import -&amp;gt; RAP action&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;manual UI wiring -&amp;gt; typed UI5 or Fiori elements metadata&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;frontend-only intent -&amp;gt; CDS annotations where possible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is much closer to the Clean Core direction. Not because custom code disappears. It does not. But because the custom code is expressed in newer, more structured extension technologies that fit S/4HANA better.&lt;/p&gt;&#xA;&lt;p&gt;For real projects I would still be careful. A large productive SEGW service can contain much more complex behavior than this demo. It may call BAPIs, use conversion exits, have custom authorization logic, support deep inserts, or depend on UI assumptions that are not visible in the service metadata. You do not solve that with one prompt.&lt;/p&gt;&#xA;&lt;p&gt;But that is also why ARC-1 matters. It gives the agent a way to inspect the real objects, not only files copied into a prompt. And with good skills, the agent can be forced to build a migration plan before touching the system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-would-take-from-this&#34;&gt;What I Would Take From This&lt;/h2&gt;&#xA;&lt;p&gt;For me the practical takeaway is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;ARC-1 is strongest when the task needs real ABAP system context.&lt;/li&gt;&#xA;&lt;li&gt;Skills are the right abstraction for repeatable SAP modernization workflows.&lt;/li&gt;&#xA;&lt;li&gt;MCP servers should be combined by responsibility, not treated as one magic tool.&lt;/li&gt;&#xA;&lt;li&gt;RAP and Fiori elements are not just &amp;ldquo;newer tech&amp;rdquo;, they give the AI a more structured target model.&lt;/li&gt;&#xA;&lt;li&gt;Clean Core migration is not only about deleting custom code. It is also about moving useful custom functionality into cleaner extension patterns.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The demo is intentionally small, but the pattern is the part I care about. If an agent can read an old SEGW service, understand a legacy UI5 app, create a RAP V4 service, modernize the freestyle UI, and generate a Fiori elements app in one guided run, then this is a useful direction for real SAP modernization work.&lt;/p&gt;&#xA;&lt;p&gt;Not as an autopilot that blindly rewrites landscapes, but as a controlled development workflow with real SAP context, clear boundaries, and human review.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly where I want ARC-1 to go.&lt;/p&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; Links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;Demo repository: arc-1-segw-to-rap&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills&#34;&gt;ARC-1 Skills&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pages.community.sap.com/topics/abap/rap&#34;&gt;ABAP RESTful Application Programming Model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ui5.github.io/typescript/&#34;&gt;UI5 TypeScript&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/SAP-samples/abap-platform-fiori-feature-showcase&#34;&gt;ABAP Platform Fiori Feature Showcase&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.novaintelligence.com/&#34;&gt;Nova Intelligence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.conduct.ai/&#34;&gt;Conduct&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_i-converted-a-legacy-segw-odata-service-to-activity-7459822169758326786-LagF&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116558132953167166&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3mlmapv4vu22d&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>ARC-1 with Joule Studio: Bringing Real ABAP System Context into Joule</title>
      <link>https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/</link>
      <pubDate>Wed, 06 May 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/&#34;&gt;previous post&lt;/a&gt;, I showed &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; with Microsoft Copilot Studio. The idea was that SAP system context should not be locked inside a local IDE. If ARC-1 runs centrally on SAP BTP, it can also be used from Teams, Microsoft 365 Copilot, SharePoint, Jira, and other places where functional consultants, architects, support teams, and project leads already work.&lt;/p&gt;&#xA;&lt;p&gt;This post is the SAP-native version of that idea. If Microsoft Copilot Studio is close to the Microsoft workday, then &lt;a href=&#34;https://help.sap.com/docs/JOULE/3fdd7b321eb24d1b9d40605dce822e84&#34;&gt;Joule&lt;/a&gt; is close to the SAP workday. SAP describes Joule as the unified assistant experience across SAP&amp;rsquo;s solution portfolio, and &lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/4444cd1ce4cd471bbe127ea2e4735b40.html&#34;&gt;Joule Studio&lt;/a&gt; as the place to build custom Joule agents with SAP and non-SAP integrations.&lt;/p&gt;&#xA;&lt;p&gt;So the question is not only: can Joule call another MCP server? The better question is: can the ARC-1 capabilities be brought to the place where SAP users already ask questions?&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-carries-over-from-earlier-posts&#34;&gt;What Carries Over From Earlier Posts&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 is a secure ADT MCP server for ABAP systems. It connects AI clients to SAP systems through &lt;a href=&#34;https://help.sap.com/docs/btp/sap-business-technology-platform/abap-development-user-guides&#34;&gt;ABAP Development Tools&lt;/a&gt; APIs and exposes this through tools like &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/&#34;&gt;SAPRead, SAPSearch, SAPWrite, SAPActivate, SAPContext, SAPDiagnose, SAPTransport, and SAPManage&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For this post, the important part is not the full tool list. It is the operating model from the earlier BTP post:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;central server instead of every user laptop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;safe by default instead of allow all by default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server ceiling + user permission + SAP authorization&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;audit logging instead of invisible local tool calls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-29-arc-1-btp/&#34;&gt;BTP post&lt;/a&gt;, I described how ARC-1 can run as a central Cloud Foundry application with &lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;XSUAA&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;BTP destinations&lt;/a&gt;, &lt;a href=&#34;https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/cloud-connector&#34;&gt;Cloud Connector&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt;, roles, and BTP audit logging. For Joule Studio, I would not create a second SAP access architecture. I would reuse that controlled endpoint.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-arc-1-adds-to-joule&#34;&gt;What ARC-1 Adds To Joule&lt;/h2&gt;&#xA;&lt;p&gt;Joule already has useful SAP context. SAP has &lt;a href=&#34;https://help.sap.com/docs/btp/btp-developers-guide/use-joule-for-developers-generative-ai-in-abap-cloud&#34;&gt;Joule for Developers&lt;/a&gt;, &lt;a href=&#34;https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/joule-for-developers-abap-ai-capabilities-5f175c94900741d6af3dbb23ce37e81a&#34;&gt;Joule for Developers, ABAP AI capabilities&lt;/a&gt;, and &lt;a href=&#34;https://help.sap.com/docs/joule/serviceguide/sap-consulting-capability-for-joule&#34;&gt;Joule for Consultants&lt;/a&gt;. So this is not about pretending Joule cannot help with ABAP at all.&lt;/p&gt;&#xA;&lt;p&gt;But there is a difference between a useful standard assistant and a tool that can query my actual ABAP system through ADT, read my custom code, inspect dependencies, run diagnostics, check release state, read ATC findings, and create a system-specific proposal.&lt;/p&gt;&#xA;&lt;p&gt;That workflow is not something I get just by opening standard Joule. If SAP does not expose this level of ABAP system access in Joule today, a custom MCP server can still bring it there. With ARC-1, Joule is no longer limited to general SAP knowledge or predefined product capabilities. It can ask the real ABAP system.&lt;/p&gt;&#xA;&lt;p&gt;Not because the model became smarter. Because the tool access became better.&lt;/p&gt;&#xA;&lt;p&gt;That matters beyond pure development. The same ADT-backed context can help architects with Clean Core planning, functional consultants with impact analysis, support teams with dumps and bug analysis, quality leads with ATC reporting, and developers with implementation proposals.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-architecture-i-would-show&#34;&gt;The Architecture I Would Show&lt;/h2&gt;&#xA;&lt;p&gt;SAP&amp;rsquo;s Architecture Center describes &lt;a href=&#34;https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e/1&#34;&gt;A2A and MCP for interoperability&lt;/a&gt;. The important part for this post is the direction: Joule as the user-facing assistant, A2A for agent-to-agent collaboration, and MCP for tool access. SAP also describes an &lt;a href=&#34;https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e/1#mcp-gateway-in-integration-suite&#34;&gt;MCP Gateway in SAP Integration Suite&lt;/a&gt; as a governed way to expose SAP and non-SAP APIs, integrations, data sources, and external MCP servers as tools for AI agents.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 fits that pattern as the ADT development-tooling adapter:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;User in Joule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Joule Studio Agent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP Integration Suite API Management / future MCP Gateway&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ARC-1 on SAP BTP Cloud Foundry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Destination Service + Connectivity Service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP Cloud Connector&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP S/4HANA or ABAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ADT development APIs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ARC-1 can fit the architecture pattern SAP describes. Joule is the user-facing AI entry point, Integration Suite is the governed access layer, ARC-1 is the ADT adapter, and the SAP system stays protected behind BTP connectivity and SAP authorizations.&lt;/p&gt;&#xA;&lt;p&gt;There are still open points. &lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/3d9dfad0bc39468292d508f0808a12fe.html&#34;&gt;Joule Studio already supports adding MCP servers&lt;/a&gt; through BTP destinations, but the documentation also lists restrictions: the destination must be streamable HTTP and MCP servers requiring interactive OAuth user authorization are not supported. SAP also shows MCP hub capabilities on the roadmap, but from what I can see this is still a future SAP Build capability and not the fully available enterprise MCP hub today.&lt;/p&gt;&#xA;&lt;p&gt;So I would present this as a target architecture and showcase, not as a final productive setup guide yet.&lt;/p&gt;&#xA;&lt;p&gt;For the showcase, I configured a Joule Studio agent with a small instruction set, Anthropic Claude Sonnet 4 as model, and two MCP servers: &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; for the ABAP system and the &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt; for official SAP documentation context. I condensed the screenshots here to show only the relevant configuration parts:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Condensed Joule Studio agent configuration showing the agent basics, instructions, model settings, execution steps, and MCP servers for ARC-1 and SAP_DOCS.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/joule-studio-agent-configuration.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-cases-i-would-show-in-this-post&#34;&gt;Use Cases I Would Show In This Post&lt;/h2&gt;&#xA;&lt;p&gt;I would not repeat all Copilot Studio examples. The Joule post should show scenarios that make sense because the user starts inside the SAP world, not in Teams or SharePoint.&lt;/p&gt;&#xA;&lt;p&gt;One note before the screenshots: I was not able to change the language in this Joule setup, so the screenshots are in German. I describe the important parts in English below each screenshot.&lt;/p&gt;&#xA;&lt;p&gt;The first task for the agent is a Clean Core readiness check for one object. It is narrow enough to be understandable and safe enough because it can be read-only:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Check whether ZCL_ARC1_DEMO_CCORE is clean-core ready.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use the real SAP system, ATC where possible, API release state, and SAP documentation.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not change anything. Return risks, evidence, and suggested next steps.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a good first agent task because it shows the difference between &amp;ldquo;Joule explains Clean Core&amp;rdquo; and &amp;ldquo;Joule analyzes this class in this SAP system for Clean Core risk&amp;rdquo;. ARC-1 reads the ABAP source, dependencies, ATC findings, and &lt;code&gt;API_STATE&lt;/code&gt;. &lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt; adds SAP guidance and released API context. Joule returns a short assessment with evidence.&lt;/p&gt;&#xA;&lt;p&gt;This is the kind of result I mean:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Joule showing a Clean Core readiness analysis for ZCL_ARC1_DEMO_CCORE with API release state, used SAP tables, and ATC result.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/joule-clean-core-object-analysis.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The screenshot is still a rough showcase, but it already shows the value. Joule is not only giving generic Clean Core advice. It can show that the class is not released for the relevant contracts, that it uses &lt;code&gt;USR02&lt;/code&gt; and &lt;code&gt;BUT000&lt;/code&gt;, and that there are no ATC findings in this small example. That is a much better starting point for an architect or developer than a general explanation of what Clean Core means.&lt;/p&gt;&#xA;&lt;p&gt;I also asked a follow-up prompt for a dependency diagram. The result was almost the answer I wanted: not perfect, but useful because it returned a Mermaid diagram and an evidence table instead of only prose. You can open the &lt;a href=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/full-reply/&#34;&gt;translated and rendered full Joule reply here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The second use case is package-level modernization planning. This is where an agent is useful because it needs multiple tool calls, grouping, prioritization, and a bit more reasoning:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Analyze package ZSD_LEGACY for Clean Core and ABAP Cloud risks.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Group the findings and create a modernization backlog.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not change code.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The same agent can combine ARC-1 for package content, dependencies, ATC, release state, and where-used information with SAP documentation for official guidance. The output should be a backlog, not a &amp;ldquo;fixed everything&amp;rdquo; claim:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 1: direct SAP table usage with released successors&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 2: ATC findings with clear fix direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 3: objects that need architecture discussion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 4: probably dead or low-value code to review later&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This screenshot shows another interesting part of Joule. The response is not only a long text answer. Joule created a left-side list with grouped findings and backlog items, and the selected item is shown with details on the right side:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Joule showing an interactive package modernization backlog with grouped Clean Core and ABAP Cloud risk categories on the left and details on the right.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/joule-package-modernization-backlog.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this run, the package &lt;code&gt;ZSD_LEGACY&lt;/code&gt; did not exist. Joule still searched the system and found 28 &lt;code&gt;ZSD*&lt;/code&gt; objects that may represent legacy risks. It grouped them into high, medium, and low risk buckets, and then created a modernization backlog. The selected high-risk card shows temporary &lt;code&gt;$TMP&lt;/code&gt; package objects, split into service definitions, tables, and message classes. That is not a final assessment, but it is a useful interactive starting point.&lt;/p&gt;&#xA;&lt;p&gt;These examples have a better through line for this post than repeating the Copilot Studio demos. Copilot Studio is good when the work starts in Microsoft 365. Joule Studio is good when the work starts in SAP, but still needs real ABAP system context.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-i-use-an-agent-here&#34;&gt;Why I Use An Agent Here&lt;/h2&gt;&#xA;&lt;p&gt;For this showcase an agent is perfectly fine. The interesting part is not the packaging. The interesting part is that Joule can call &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; and the &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt;, collect system evidence, and turn that into something useful for the user.&lt;/p&gt;&#xA;&lt;p&gt;For ARC-1 I would still keep the first Joule Studio agent conservative: one object or one package, read-only by default, no automatic rewrite. I would not start with a big automation story. I would start with analysis, evidence, and a proposal.&lt;/p&gt;&#xA;&lt;p&gt;And yes, you can also vibe code with this. If write access is enabled for a development or sandbox system, a Joule Studio agent can propose changes and call ARC-1 to apply them. I just do not want this to be the main story here, because the more important point is the architecture: first give Joule controlled access to real ABAP system context, then decide which write actions are safe enough.&lt;/p&gt;&#xA;&lt;h2 id=&#34;open-points&#34;&gt;Open Points&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf&#34;&gt;SAP API Policy&lt;/a&gt; also matters here, but it should not become the whole post. ARC-1 should be positioned as ADT development tooling, not as a generic business-data extraction layer. Clean Core checks, ATC, code inspection, syntax checks, ABAP Unit, activation, and development support are the story. Data extraction is not the story.&lt;/p&gt;&#xA;&lt;p&gt;This is also why the Joule Studio architecture is interesting. SAP&amp;rsquo;s architecture guidance describes SAP Integration Suite and API Management as part of a governed pathway for AI agents, including a governance layer like an MCP gateway in front of APIs. That is much closer to the setup in this post than a local MCP server on a developer laptop. It gives the agent a controlled entry point, central configuration, identity, monitoring, and auditability. It does not mean every possible ADT usage is automatically fine, but the architecture shape is much closer to what SAP is describing for API agents.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-matters&#34;&gt;Why This Matters&lt;/h2&gt;&#xA;&lt;p&gt;Copilot Studio and Joule Studio are different surfaces:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Copilot Studio = close to Teams, Microsoft 365, SharePoint, Excel, Word, Jira&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Joule Studio = close to SAP products, SAP Build, Joule agents, SAP users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC-1 = governed ABAP system access layer that can serve both&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The client can change, but the security model should not. For me that is the main point. ARC-1 should not be locked to Claude, Cursor, Copilot Studio, or Joule Studio. If the company allows it, the same governed ARC-1 endpoint should be usable from different AI clients.&lt;/p&gt;&#xA;&lt;p&gt;And ARC-1 is open source, which is important to me. If this kind of access layer becomes part of SAP AI architectures, then people should be able to inspect how it works, challenge the security model, test it against real systems, and decide for themselves if it fits their landscape.&lt;/p&gt;&#xA;&lt;p&gt;Also, this does not have to start with write access. Even read-only mode is already very powerful. Reading code, dependencies, ATC findings, release state, dumps, messages, packages, and where-used information can help architects, consultants, support teams, and developers without the assistant writing a single line of ABAP.&lt;/p&gt;&#xA;&lt;p&gt;The target picture is not &amp;ldquo;AI writes ABAP from a chat prompt&amp;rdquo;. The better target is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;the user asks inside Joule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Joule has access to the right tools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC-1 provides real ABAP system context&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP documentation provides the official direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Integration Suite provides governance&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP authorizations still protect the backend&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;humans approve the risky parts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is much more interesting than a local MCP demo. It is also much closer to what I think enterprise ABAP agentic development needs.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116529573994656695&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3ml7kulu55s2v&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_what-if-joule-could-answer-abap-and-clean-activity-7458010353239691264-gbF0&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/tools/&#34;&gt;ARC-1 Tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/&#34;&gt;ARC-1 Authorization and Roles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;ARC-1 BTP Cloud Foundry Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;ARC-1 Principal Propagation Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/JOULE/3fdd7b321eb24d1b9d40605dce822e84&#34;&gt;SAP Help: What is Joule?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/4444cd1ce4cd471bbe127ea2e4735b40.html&#34;&gt;SAP Help: What is Joule Studio?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/3d9dfad0bc39468292d508f0808a12fe.html&#34;&gt;SAP Help: Add MCP Servers to Your Joule Agent&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e/1&#34;&gt;SAP Architecture Center: A2A and MCP for Interoperability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/integration-suite/sap-integration-suite/api-management-capability&#34;&gt;SAP Integration Suite API Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/btp/btp-developers-guide/use-joule-for-developers-generative-ai-in-abap-cloud&#34;&gt;SAP Joule for Developers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/joule-for-developers-abap-ai-capabilities-5f175c94900741d6af3dbb23ce37e81a&#34;&gt;SAP Joule for Developers, ABAP AI capabilities&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/joule/serviceguide/sap-consulting-capability-for-joule&#34;&gt;SAP Joule for Consultants&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf&#34;&gt;SAP API Policy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
  </channel>
</rss>
