abap-cloud-migration — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited abap-cloud-migration (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Guide for systematically raising the clean core level of classic ABAP custom code — eliminating Level D, minimizing Level C, and moving toward Level A (ABAP Cloud).
Terminology note: the former 3-tier extensibility model is superseded by the clean core level concept (A, B, C, D). Migration is no longer "get everything to Tier 1" — it is "eliminate Level D, minimize Level C, accept stable Level B, target Level A for new work". See the abap-cloud skill for the level definitions.ABAP_CLEAN_CORE_DEVELOPMENT (SAP-delivered) or build a variant from ABAP_CLOUD_DEVELOPMENT_DEFAULT including:SYCM_USAGE_OF_APIS — released/classic API classification, SQL on SAP tables, SAP form routinesSYCM_ALLOWED_ENH_TECHNOLOGY — enhancement technology complianceCI_SEARCH_CUST_MODIFICATIONS — modificationsCI_CRITICAL_STATEMENTS — critical statementsSLIN_SEC — Code Vulnerability Analyzer (additionally recommended)ABAP_CLOUD_READINESS to verify ABAP Cloud rules before switching an object's language versionIfSYCM_USAGE_OF_APISorSYCM_ALLOWED_ENH_TECHNOLOGYare unavailable, implement SAP Note 3565942.
| ATC priority | Level | Finding | Action |
|---|---|---|---|
| Priority 1 (Error) | D | Object is modified | Remove modification; use a BAdI instead |
| Enhancement technology is not allowed | Delete enhancement; use a BAdI | ||
| Implicit or explicit enhancement (source code plug-in) | Delete enhancement; use a BAdI | ||
| Direct write access to SAP database tables | Use released or classic APIs | ||
| Call of form routines in SAP program | Use released or classic APIs | ||
Usage of SAP object classified as noAPI | Use released or classic APIs; check successor info | ||
| Usage of critical ABAP statements | Use released or classic APIs | ||
| Priority 2 (Warning) | C | Direct read access to SAP database table/view | Use released CDS view or classic API |
| Usage of SAP object not classified as classic API (internal) and not released | Use released or classic APIs | ||
| Priority 3 (Info) | B | Usage of deprecated APIs | Use the successor |
| Usage of classic APIs | — acceptable, no action required |
Configure ATC transport settings so priority 1 and 2 findings block transport release.
noAPI) APIs → released or classic APIsS_ABPLNGVS authorization and separate software components| Option | When to apply | Typical tasks |
|---|---|---|
| Retire unused code | ~60% of custom code in a typical ERP is not used productively | Collect usage data with SUSG/SCMON · analyze in Custom Code Migration app · remove/backup unused code · use the clone finder |
| Renovate & innovate side-by-side | Loosely coupled extensions better served on SAP Business AI Platform | Analyze dependencies in Custom Code Migration app · transfer code to BTP · adapt via ATC quick fixes |
| Renovate & innovate on-stack | Tightly coupled extensions/modifications worth reimplementing in ABAP Cloud | Analyze complexity for TCO drivers · make code ABAP Cloud compliant · replace non-released objects with released APIs · use only released extension points |
| Adapt | None of the above is feasible — minimum viable action | Adapt via readiness ATC checks, Simplification Database, ADT quick fixes (up to ~60% automation) · SQL Monitor · CDS/AMDP pushdown |
Recommendation: leave behind as much legacy code as possible during the conversion — cleaning up afterwards costs significantly more.
Custom code using internal SAP objects is not upgrade-stable by definition. Internal objects can change during an upgrade, a feature pack import, or even an SAP Note import.
Incompatible changes include:
Covered object types: FUNC, CLAS, INTF, STOB, BDEF.
How to use it:
SYCMObjects in the changelog are not automatically demoted to Level D — continued usage may be allowed depending on the change's scope and criticality.
| Classic Pattern | ABAP Cloud Replacement |
|---|---|
SELECT FROM mara | SELECT FROM i_product |
SELECT FROM bkpf / bseg | SELECT FROM i_journalentry |
SELECT FROM vbak / vbap | SELECT FROM i_salesorder |
SELECT FROM ekko / ekpo | SELECT FROM i_purchaseorder |
SELECT FROM kna1 | SELECT FROM i_customer |
SELECT FROM lfa1 | SELECT FROM i_supplier |
SELECT FROM t001 | SELECT FROM i_companycode |
| Direct table access | Use I_* released CDS views |
| Classic FM | Released Replacement |
|---|---|
GUID_CREATE | cl_system_uuid=>create_uuid_x16_static( ) |
CONVERSION_EXIT_ALPHA_INPUT | cl_abap_format=>alpha_input( ) |
CONVERSION_EXIT_ALPHA_OUTPUT | cl_abap_format=>alpha_output( ) |
POPUP_TO_CONFIRM | Not available — use Fiori UI |
NUMBER_GET_NEXT | cl_numberrange_runtime=>number_get( ) |
BAPI_TRANSACTION_COMMIT | Handled by RAP framework (no explicit commit) |
SO_NEW_DOCUMENT_ATT_SEND_API1 | cl_bcs_mail_message (send emails) |
READ_TEXT / SAVE_TEXT | Not released — wrap or use custom persistence |
JOB_OPEN / JOB_CLOSE / JOB_SUBMIT | cl_apj_rt_api (Application Jobs) |
ENQUEUE_* / DEQUEUE_* | RAP draft / managed locking or CL_ABAP_LOCK_OBJECT |
| Incompatible Construct | Cloud-Compatible Alternative |
|---|---|
CALL TRANSACTION | Not available — use API or RAP |
SUBMIT ... AND RETURN | Not available — use Application Jobs |
WRITE / SKIP / ULINE (list output) | Not available — use Fiori UI for output |
CALL SCREEN / CALL SELECTION-SCREEN | Not available — use Fiori/UI5 |
MESSAGE ... RAISING | RAISE EXCEPTION TYPE ... |
CALL FUNCTION ... IN UPDATE TASK | RAP saver class / managed save |
EXEC SQL (Native SQL) | ABAP SQL or AMDP |
GENERATE SUBROUTINE POOL | Not available — use strategy/factory pattern |
DESCRIBE FIELD ... TYPE | RTTI: cl_abap_typedescr=>describe_by_data( ) |
GET/SET PARAMETER ID | Not available — use method parameters |
When no released API exists, create a wrapper class in a classic ABAP software component and release it for ABAP Cloud (Level A) consumption.
Wrapper level classification:
Wrapping also collapses N ATC findings into 1, so a single fine-grained exemption covers the usage. This is SAP's recommended practice for working with internal SAP objects.
"Released for use in ABAP Cloud (C1 contract)
INTERFACE zif_text_handler
PUBLIC.
METHODS read_text
IMPORTING iv_id TYPE thead-tdid
iv_name TYPE thead-tdname
iv_object TYPE thead-tdobject
iv_language TYPE sy-langu DEFAULT sy-langu
RETURNING VALUE(rt_text) TYPE tline_tab
RAISING zcx_text_error.
METHODS save_text
IMPORTING iv_id TYPE thead-tdid
iv_name TYPE thead-tdname
iv_object TYPE thead-tdobject
iv_language TYPE sy-langu DEFAULT sy-langu
it_text TYPE tline_tab
RAISING zcx_text_error.
ENDINTERFACE."Implementation uses non-released FMs internally
"Released for use in ABAP Cloud (C1 contract)
CLASS zcl_text_handler DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_text_handler.
ENDCLASS.
CLASS zcl_text_handler IMPLEMENTATION.
METHOD zif_text_handler~read_text.
"Uses non-released FM internally — acceptable inside the wrapper
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = iv_id
name = iv_name
object = iv_object
language = iv_language
TABLES
lines = rt_text
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_text_error.
ENDIF.
ENDMETHOD.
METHOD zif_text_handler~save_text.
DATA ls_header TYPE thead.
ls_header-tdid = iv_id.
ls_header-tdname = iv_name.
ls_header-tdobject = iv_object.
ls_header-tdspras = iv_language.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING header = ls_header
TABLES lines = it_text
EXCEPTIONS OTHERS = 1.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_text_error.
ENDIF.
ENDMETHOD.
ENDCLASS.In ADT, open the wrapper class properties:
"ABAP Cloud code — uses released wrapper
DATA(lo_text) = NEW zcl_text_handler( ).
DATA(lt_text) = lo_text->zif_text_handler~read_text(
iv_id = 'ST'
iv_name = lv_doc_name
iv_object = 'VBBK' ).SU22 data for the wrapper when releasing it, and create SU22 variants for each designated usage so roles can be maintained.TYPES declarations in the wrapper's public section, so only the wrapper needs releasing.Classic Report → Application Job class + CDS view + Fiori app
1. Extract data logic → CDS view entities
2. Extract business logic → ABAP Cloud class
3. Create Application Job catalog entry (CL_APJ_DT_CREATE_CONTENT)
4. Schedule via Fiori app "Application Jobs"Dynpro Transaction → RAP BO + Fiori Elements app
1. Identify CRUD operations → RAP behavior definition
2. Map screen fields → CDS view entity
3. Create service definition/binding
4. Generate Fiori Elements appBAPI → RAP BO with custom actions
1. Map BAPI parameters → CDS abstract entities
2. Implement as RAP actions or factory actions
3. Expose via OData service bindingRFC FM → Released API class or RAP service
1. If simple logic → Released ABAP class (Level A)
2. If CRUD → RAP BO with service binding (Level A)
3. If complex → Wrapper class in classic ABAP (Level B or C)Ctrl+Shift+A → Filter by "Released" APIsFiori app Released Objects (F5865):
Determine an object's clean core level and successor:
objectClassifications_SAP.json — viewer at https://sap.github.io/abap-atc-cr-cv-s4hc/?version=objectClassifications_SAP.jsonstate = noAPIinternalAPI"Check if an object is released for ABAP Cloud (Level A)
SELECT SINGLE *
FROM i_apistateofrepositoryobject
WHERE ObjectType = 'CLAS'
AND ObjectName = 'CL_NUMBERRANGE_RUNTIME'
AND ReleaseState = 'RELEASED'
INTO @DATA(ls_state).ABAP_CLEAN_CORE_DEVELOPMENT) on the package/objectsnoAPI object usage → check successor informationSYCM and check for incompatible changesSU22 data and variants for the wrapperABAP_CLOUD_READINESS before switching an object's language versionWhen helping with migration topics, structure responses as:
## Migration Guidance
### Current Code Analysis
- Current clean core level: [A / B / C / D] (lowest level used)
- Level D findings (must fix): [list]
- Level C findings (minimize): [list]
- Level B findings (monitor): [list]
- Incompatible constructs: [list]
- Estimated effort: [low / medium / high]
### Remediation Strategy
[Ordered by level: D first, then C, then B]
[For each finding: original → replacement with code, target level]
### Wrapper Requirements
[Objects needing wrappers, with the resulting wrapper level (B or C)]
### Target State
- Achievable clean core level: [A / B]
- Residual exemptions required: [list with justification]references/migration-checklist.md for the full level-based remediation checklist, effort estimation, and rollback planning~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.