<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Segw on Marian Zeis Blog</title>
    <link>https://blog.zeis.de/tags/segw/</link>
    <description>Recent content in Segw 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/segw/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/marianfoo/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/marianfoo/arc-1-segw-to-rap&#34;&gt;github.com/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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 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;The MCP setup was split by responsibility. &lt;a href=&#34;https://github.com/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/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/marianfoo/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marianfoo.github.io/arc-1/&#34;&gt;ARC-1 Documentation&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://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>
  </channel>
</rss>
