Clean core

Clean core is a project. Here is how it runs.

Many objects. Several developers, each on their own machine. Months of work, and a board that wants to know where it stands. These are the eight steps, what CSPeach does at each one, and — plainly — what is built today.

Stop the bleeding. New work goes in clean: the approach and the level are decided before the build.
Clean what you have. The custom code you already run, counted, classified, fixed and proven.

The programme, step by step

How a clean-core project runs.

Eight steps, in the order they happen. Each one says what is built today, and where something is still planned it says that too.

  1. Scope

    Start from what the system says exists. cspeach team discover reads the system inventory: the packages, the custom code objects, the changes to SAP's own objects, and how long the system has recorded usage. Not a spreadsheet someone kept: the system's own answer.

    /abap-cca reads that inventory and proposes the scope: packages in, out, or to ask about, and candidates to retire. It runs no check and writes no files. The lead decides what is in.

    • cspeach team discover
    • /abap-cca
    Built The project's count is matched against the system's count the day it opens. It is the zero every later measurement is read against.
  2. Split

    The lead starts the project in a folder the team already shares, such as OneDrive, and adds the people. The lead picks the ATC check variant. SAP's own ABAP_CLOUD_READINESS is offered first, and CSPeach checks the system has it. The lead picks one transport request for the project, and every write card names it.

    The packages split into lanes, balanced by the work, one person to each lane. The lead can move a package to someone else, with a reason.

    How it ran with two people

    • cspeach team start
    • cspeach team lane move
    Built Run live with two people in one shared folder: one check variant, one transport request, lanes split by the work.
  3. Measure

    SAP's own check — ATC — runs over the whole scope with the check variant the lead picked. Out comes the list: what breaks the rules, where, how badly. Nobody opens programs one by one to find problems; the system's check finds them.

    If the check runs on a central system, CSPeach reads its export file instead.

    • cspeach team refresh
    • --from-file
    Built Proven live with SAP's S/4HANA readiness rule set and with SAP's ABAP Cloud readiness rule set.
    Measured on a live S/4HANA system with SAP's ABAP Cloud readiness rule set, on our own test package.
    43objects asked about
    28with findings
    15clean
    775findings
    19seconds to answer

    SAP's clean-core check stays silent about clean objects when the same run finds anything. CSPeach never takes silence for clean — an object it has heard nothing about is shown as “not measured”.

    So we ran the silent 15 again on their own. SAP listed all 15 with no findings, in under five seconds. Clean.

    The 775 are not one kind of work. About one in four is fix: read a released view instead of an SAP table, use a released type. About three in four is decide: a classic report with list output, selection screens or ALV does not get fixed into ABAP Cloud, so someone decides to keep it at its level, retire it or rebuild it. That is step 4, and it is why management signs it off.

    SAP's own checks, in SAP's words: Usage of Released APIs 425 · ABAP Language Version 320 · object types not allowed in cloud development 16 · other 14. By priority: 722 · 39 · 14. The rule set is ABAP_CLOUD_READINESS, a standard check variant on the system, not ours.

    Built Objects the run did not list are checked again on their own, up to 200 per run.
  4. Decide

    Each person triages their own rows. CSPeach proposes what happens to each object — keep, fix, retire or rebuild — and a level, A to D, with the evidence behind it. The card says plainly that it is a proposal:

    A row card, as CSPeach printed it on the live run

    Record CLAS ZCL_MM_EQUIP as proposed: fix, level C, no target set?

    Proposed reason: uses 1 not-released application API; swap it for a released successor

    Matches your rule: a small class using unreleased or deprecated APIs: swap to released ones

    Every decision says whose words they are. A proposal stays marked “proposed”. A person's own reason reads as theirs. When two people disagree, the lead's ruling settles it, and the History shows it as a ruling.

    The lead can set a target level for the whole project or for one object. With no target, CSPeach says “no target set”.

    • cspeach team decide
    • cspeach team rule
    • cspeach team target
    • /abap-clean-core
    Built Run live: proposals kept as proposals, typed reasons kept in the person's words, and a lead's ruling that settled a disagreement. /abap-clean-core classifies one object A to D with citable evidence. Retire stays a candidate until your lead confirms it.
  5. Fix

    Approval-gated is the default write mode. Each fix waits behind a card that shows what changes in behaviour, the transport, the risk and why it was raised, and the method diff. The person approves each write.

    A fix card, as CSPeach printed it on the live run

    Change class ZCL_MM_EQUIP

    Behaviour: Same fields and rows from the same table, but I_Equipment applies SAP's equipment access control …

    Package ZMM_STOCK · Transport: S4HK903753 (object already locked here)

    Risk: medium (raised: activation makes the change live on the system)

    [a] Approve   [d] Show diff   [s] Skip   [c] Cancel turn

    A snapshot comes first, then the write, the syntax check and activation. The hard ones — modifications, internal SAP objects with no successor — get a design before anyone touches them.

    • /abap-upgrade-fix
    • /abap-atc-fix
    • /abap-refactor
    Built Object by object, each write approved on a card that names its transport.
    Built A working list for each person: their next objects, in a suggested order.
  6. Prove

    A fix counts only when SAP's own check proves it. After the write, the object reads “fixed, awaiting check”. When the team check runs again, it reads “fix proven”, or “fix failed the check”. A developer's word starts the clock; the check stops it.

    The fix card, and the road to proof

    • cspeach team refresh
    Built Proven live (S/4HANA readiness rule set): a fix proven, a clean object, and a fix that failed the check.
    Built Proven live (ABAP Cloud readiness rule set): fixes written to SAP by two people, each proven by the team check.
  7. Report

    One set of numbers, everywhere. Management reads the status page and the Excel workbook: Summary, Objects, For the business, and History. The terminal status, the status page and the workbook show the same counts, and the CSV export carries every object row behind them.

    Nobody fills anything in. The files are written into the shared folder as the work happens, and the status page is read-only.

    • cspeach team status
    • cspeach team report
    • cspeach team export
    Built The status page, the workbook and the CSV export. Team projects are new — ask us for access.
    Built Progress over time on the status page, one point per check run, and the History sheet. Accepted exceptions, kept by decision with their reason.
    Planned A wave sign-off.
  8. Keep

    After go-live, new code goes in clean: the approach and the level are decided before the build, and every write is syntax-checked before it is activated. Cleaning up the old code is a project with an end. Keeping new code clean has no end — it is how every change is built from then on.

    • /abap-clean-core
    • /abap-rap
    Built Decided first with /abap-clean-core; a syntax check on every write.
    Planned ATC and the released-API check after every write.

Built is in the product today. Planned is what we're building next — no date yet.

How a clean-core project runs Eight steps on one road. Seven of them work through the custom code a customer already runs: Scope reads the system's own inventory with cspeach team discover, Split starts the project in a shared folder with one transport request and splits the packages into lanes balanced by the work, Measure runs SAP's own check over the whole scope with cspeach team refresh, Decide has each person triage their own rows: keep, fix, retire or rebuild, with a level, Fix changes objects one at a time, each write approved on its card, Prove runs the same check again and says fix proven or fix failed the check, and Report writes the status page, the Excel workbook and the CSV export, which show the same counts. A fix that failed the check goes straight back from Prove to Fix. The eighth step, Keep, is the other job: new code goes in clean, with the approach and the level decided before the build. Report and Keep each carry a built tag and a next tag; the other six carry a built tag. A CLEAN-CORE PROJECT · EIGHT STEPS Two jobs, eight steps, one road. A fix counts when a check proves it. Prove sends a fix that failed the check back to Fix. CLEAN WHAT YOU HAVE · STEPS 1 TO 7 STOP THE BLEEDING · NEW CODE GOES IN CLEAN fix failed the check BUILT Scope The system's own inventory, counted, not guessed cspeach team discover BUILT Split Shared folder, one transport, lanes balanced by the work cspeach team start BUILT Measure SAP's own check runs over the whole scope cspeach team refresh BUILT Decide Each person triages their rows: keep, fix, retire or rebuild cspeach team decide BUILT Fix Object by object, each change approved on its card /abap-upgrade-fix · /abap-atc-fix BUILT Prove The same check runs again: fix proven, or fix failed the check cspeach team refresh BUILT NEXT Report The status page, the workbook and the CSV: the same counts cspeach team report · export Keep New code goes in clean — the approach and the level decided before the build /abap-clean-core · /abap-rap BUILT NEXT
The eight steps as one road. Steps 1 to 7 work through the code you already have; step 8 is the other job — new code goes in clean, from day one. Prove sends a fix that failed the check straight back to Fix.

Run live with two people

Two people, one project.

We ran a clean-core project on a live S/4HANA system with two people in one shared folder. This is how the work moved, in the words CSPeach printed.

Two people, one clean-core project Sarah, the lead, starts the project in a folder the team already shares, and James joins it. The packages split into two lanes, one for each person. In each lane the person triages their own rows, fixes their own objects with each write approved, and the team check proves the fix before they take the next object. The lead moves a package from James's lane to Sarah's, and the reason is recorded: James is on the AR close this week. THE LANES One shared folder. A lane for each person. SARAH'S LANE JAMES'S LANE STARTS IT JOINS IT THE NEXT OBJECT THE NEXT OBJECT ZSD_ORDERS Sarah Davis, the lead cspeach team start The shared folder ONEDRIVE · ONE PROJECT, ONE SET OF FILES James Miller cspeach team join Triage her own rows cspeach team decide Fix her own objects EACH WRITE APPROVED Proven by the check cspeach team refresh Triage his own rows cspeach team decide Fix his own objects EACH WRITE APPROVED Proven by the check cspeach team refresh The lead moves a package, with a reason Why: James is on the AR close this week. Each person works their own lane. One project holds it all. The packages split into lanes, balanced by the work. The move is recorded in the project history.
Sarah, the lead, starts the project in the shared folder and James joins it. Each of them fixes only their own objects; the lead can decide on any. When James was busy with the AR close, Sarah moved one of his packages to herself, and the reason went into the history.

Every decision keeps whose words it is. A proposal stays marked “proposed”. A person's reason stays theirs. When two people disagree, the lead's ruling settles it, and the History sheet shows it as a ruling.

Every decision says whose words it is Three kinds of words, as CSPeach printed them on the live run: a proposal for ZCL_MM_EQUIP is marked proposed, Sarah's own reason for ZFI_AGING appears under Why in her words, and the lead's ruling on ZFI_NATIVE_SUM prints as a ruling. The History sheet keeps all three apart. For ZFI_NATIVE_SUM, James recorded the proposal to fix, Sarah decided keep in her own words, and her ruling as lead settled it; the two earlier rows read replaced later. WHOSE WORDS Every decision says whose words it is. PROPOSED CSPeach proposes Record CLAS ZCL_MM_EQUIP as proposed: fix, level C, no target set? IT STAYS A PROPOSAL UNTIL A PERSON AGREES. THEIR WORDS A person's own reason Fix ZFI_AGING now? Why: Aging stays a classic report; B is the realistic level Target B (set by Sarah Davis), now C. TYPED BY SARAH, SHOWN AS HERS. RULING The lead's ruling cspeach team rule PROG ZFI_NATIVE_SUM keep --reason "…" ✓ Ruled: PROG ZFI_NATIVE_SUM — keep (ruled by you). Why: Finance runs it at month end; stays classic until the upgrade. IT SETTLES A DISAGREEMENT, AND SAYS SO. THE HISTORY SHEET · ZFI_NATIVE_SUM WHO WHAT WHY Sarah Davis ruling: keep Finance runs it at month end; stays classic until the upgrade Sarah Davis decision: keep (replaced later) Month-end report run by finance; it stays classic until the S/4 upgrade James Miller decision: fix (replaced later) proposed: Native SQL (EXEC SQL) hides which tables it reads … A proposal never passes for a person's word. The rows are from the live run, newest first.
The History rows are from the live run. James recorded the proposal to fix, Sarah decided to keep it in her own words, and her ruling as lead settled it. The two earlier rows read “(replaced later)”.

Proof

Approved on a card, then proven.

Each fix waits behind a card, and the person approves the write. Then it waits for the team check. On the live run two people wrote three fixes to SAP, and SAP's own ATC check proved each one.

The fix card The card CSPeach printed before writing a fix to class ZCL_MM_EQUIP on the live run. It says what changes in behaviour in plain words, the package and the transport, which here reads object already locked here, the risk and why it was raised, and the keys: show the method diff, approve, skip or cancel. By default, the person approves each write. THE FIX CARD Each fix waits behind a card. APPROVAL Change class ZCL_MM_EQUIP Behaviour: Same fields and rows from the same table, but I_Equipment applies SAP's equipment access control: a user without authorization for an equipment (e.g. its plant or authorization group) no longer gets that row back. Package ZMM_STOCK · Transport: S4HK903753 (object already locked here) Risk: medium (raised: activation makes the change live on the system) [a] Approve [d] Show diff [s] Skip [c] Cancel turn What changes in behaviour in plain words, before anything is written The transport the request the write goes to; “object already locked here” when SAP already holds it The risk, and why the level, and the reason it was raised The diff, then a yes [d] shows the method diff; [a] approves this one write By default, the person approves each write. The card as CSPeach printed it on the live run. Approval-gated is the default write mode.
The card CSPeach printed before one of those fixes. SAP already held the object in the project's request, so the card said “object already locked here”.

After the write, the object reads “fixed, awaiting check”. Only the team check, cspeach team refresh, moves it on.

From proposal to proof An object moves through four states. CSPeach proposes what to do with it, a person decides, and once the fix is written and approved it reads fixed, awaiting check. Only when SAP's own check runs again and passes does it read fix proven. If the check still finds the problem, it reads fix failed the check, and the person fixes it again. FROM PROPOSAL TO PROOF A fix counts when SAP's check proves it. RECORDED WRITTEN PASSES THE CHECK STILL FINDS IT FIX IT AGAIN Proposed CSPEACH'S PROPOSAL Decided cspeach team decide Fixed, awaiting check WRITTEN, APPROVED ON ITS CARD Fix proven cspeach team refresh Fix failed the check THE FINDING IS STILL THERE The check is SAP's own ATC, with the check variant the lead picked. “Fixed, awaiting check” stays its own state until the team check runs.
From proposal to proof. When the check still finds the problem, the object reads “fix failed the check”, and the person fixes it again.

What management reads

One set of numbers.

The terminal status, the status page and the Excel workbook show the same counts, and the parts add up. The CSV export carries every object row behind them.

One set of numbers, everywhere One project view, read from the shared folder, feeds four places: the terminal status, the read-only status page, the Excel workbook with its Summary, Objects, For the business and History sheets, and the CSV export. The terminal, the page and the workbook show the same counts, and the CSV carries every object row behind them. On the live run that was 28 objects, 22 decided and 3 fixes proven, with 28 rows in the CSV. FOUR PLACES, ONE COUNT One project view. The same counts everywhere. The project view READ FROM THE SHARED FOLDER ONE COUNT, WORKED OUT ONCE The terminal status cspeach team status 28 · 22 · 3 The status page READ-ONLY, IN THE BROWSER 28 · 22 · 3 The Excel workbook Summary · Objects · For the business · History 28 · 22 · 3 The CSV export EVERY OBJECT ROW BEHIND THE COUNTS 28 rows The parts add up. On the live run: 28 objects · 22 decided · 3 fixes proven, the same on the terminal, the page and the workbook.
The counts are from the live run. The CSV export had one row for each of the 28 objects.

Three seats

Who does what.

Nobody fills in a status. The files are written as the work happens.

Sets the scope

Management
  • Agrees which packages are in, and which check variant SAP's check runs with.
  • Signs off the decisions: keep, fix, retire, rebuild.
  • Reads the status page and the workbook whenever they want the position. Both show the same counts.

Runs the project

Lead
  • Starts the project in a shared folder, adds the people and picks one transport request for the project.
  • Sets the target, moves a package between lanes with a reason, and rules when two people disagree.
  • Runs the team check that proves what the team fixed.

Does the work

Developer
  • Triages their own rows and fixes their own objects, on their own machine, from their own working list.
  • Approves each write on a card that shows the behaviour, the transport, the risk and the diff.
  • Writes nothing into a tracker — the project files are written as they go.

Skill by skill

What CSPeach does for clean core.

/abap-clean-core

Classify an object.

Recommends the clean-core approach for a requirement or an object, and classifies the clean-core level A, B, C or D — with citable evidence to defend the call.

When CSPeach is connected, it verifies that against your live system: released-API state and ATC.

Read-only
/abap-cloud-check

Check the code.

Checks ABAP code for clean core and cloud readiness — unreleased APIs, classic statements, direct access to SAP standard tables, and statements not allowed in ABAP Cloud.

Each finding comes with concrete modernization guidance.

Read-only
/abap-cca

Assess the whole estate.

Judgement over the inventory the lead already pulled with cspeach team discover: the scope (packages in, out, or to ask about), an application area for packages without one, and retire candidates with their evidence. Retire stays a candidate until your lead confirms it.

It runs no ATC and no SQL, and writes no files. It ends with the exact team commands to run next.

Read-only
/abap-rap

Build clean.

Builds a complete RAP stack — database table, CDS interface view, CDS projection view, behavior definition, behavior implementation, metadata extension, service definition, service binding — created and activated on your system in dependency order, after a plan your developer approves.

On a model that already exists, /abap-extend-model adds a field, a UI column, a validation, a determination or an action in place, and /abap-eml writes and tests the EML.

/abap-upgrade-scan · -fix · -verify

Fix what the upgrade finds.

/abap-upgrade-scan runs the ATC readiness scan. /abap-upgrade-fix works through the findings with successor-API lookup, a syntax check before every write, and snapshot rollback if one goes wrong.

/abap-upgrade-verify writes the sign-off report.

/abap-enhance

Extend standard.

Extends SAP-delivered standard through BAdIs, enhancement spots and exits.

It explains the trade-offs between them before anything is chosen.

/abap-modernize

Modernize a classic program.

Moves a classic program to the best modern architecture your release supports — RAP, SEGW or OO.

Which one it proposes depends on the release you are on.

Clean-core levels, in order New custom development walks the levels in order. Level A is the default: released interfaces only. Level B is official classic APIs, taken by documented exception when there is no released API, and it costs one line documenting the gap. Level C is SAP internal objects, approved, wrapped behind one Z-interface and watchlisted, and it needs architecture-board approval before the build. Level D is forbidden for new code: the step is never taken. Whether a new D finding stops a transport is a rule for your own release process; CSPeach does not enforce one. NEW CUSTOM DEVELOPMENT Walk the levels in order. A → B → C. NEVER D. Each step down needs a reason, written down. THE GATE · ATC AT TRANSPORT RELEASE NO RELEASED API ONE LINE DOCUMENTING THE GAP SAP INTERNAL OBJECTS ONLY WITH ARCHITECTURE-BOARD APPROVAL A The default RELEASED INTERFACES ONLY api.sap.com B By documented exception OFFICIAL CLASSIC APIS BADIS · USER EXITS · ALV C Approved, wrapped, watchlisted AN ARCHITECTURE DECISION, NEVER AN ACCIDENT ONE Z-INTERFACE D Forbidden for new code NO NEW MODIFICATIONS A RULE FOR YOUR OWN RELEASE PROCESS
The levels /abap-clean-core classifies an object against — A, B, C or D — worded as the one-page guidelines in the free toolkit word them.

Where the knowledge comes from

Written rules, then your system's verdict.

Each skill carries written rules for RAP, CDS and ABAP Cloud — naming, the order objects must be created and activated in, type codes, annotations, draft handling, access control. Those rules were learned on live S/4HANA systems, and they are part of the skill.

Then the result is checked on your own system. Nothing is called done because it looked right.

CSPeach proposes.
Your system decides.

RAP and CDS

The whole stack, in build order.

This is what /abap-rap creates, and the order it creates it in.

  1. Database table
  2. CDS interface view
  3. CDS projection view
  4. Behavior definition
  5. Behavior implementation
  6. Metadata extension
  7. Service definition
  8. Service binding

Created and activated on your system in dependency order, after a plan your developer approves.

Works where you are

Starting from the system you have today.

ECC EHP7+, on-premise S/4HANA, and S/4HANA Cloud Private Edition. The clean-core work starts on the system the customer has today — there is no move to make first.

CSPeach is read-only by default, and approval-gated is the default write mode. Each write is snapshotted, syntax-checked, activated and verified. A session writes to the session's transport, but an object SAP already holds in a request stays in that request, and the card says so. In a team project, the lead picks one request at the start, and every write card names the request it goes to. The gates are written out on the trust page.

Questions

Asked plainly, answered plainly.

Do you read our code to find the problems?

No — SAP's own check does. ATC runs over the scope you choose with the rule set you choose, and the findings are SAP's: what breaks the rules, where, and how badly. CSPeach runs that check, or reads its export, and turns what comes back into the project's picture. Nobody opens programs one by one to go looking. Measured on a live S/4HANA system with SAP's ABAP Cloud readiness rule set, on our own test package: 43 objects asked about, 28 with findings, 15 clean, 775 findings in 19 seconds. SAP's clean-core check stays silent about clean objects when the same run finds anything, so we ran the silent 15 again on their own and SAP listed all 15 with no findings. CSPeach never takes silence for clean.

Our ATC runs on a central system.

Then CSPeach reads its export instead of running the check itself. cspeach team refresh --from-file takes the ATC result file your central system produces and measures the project against it, exactly as it would a run of its own.

How many developers can work at once?

As many as you have. The packages split into lanes, balanced by the work, and each developer takes a lane. Everyone works on their own machine and writes into a folder your team already shares — one writer per file, so nothing is overwritten and nobody waits for anybody. The lead can move a package between people, with a reason. We ran it live with two people.

What does management see?

The status page and the Excel workbook, with its Summary, Objects, For the business and History sheets. They show the same counts as the terminal status, and the CSV export carries every object row behind them: every object in scope, who owns it, what was decided and in whose words, and what SAP's check has proven. Nobody fills anything in. Team projects are new — ask us for access.

Ask us for access

What is not built yet?

Two things, named plainly. A wave sign-off. And ATC and the released-API check after every write — today a write gets a syntax check, then activation and a check that the object really went active. CSPeach does not block a transport; that gate, if you want one, belongs to your release process.

Does it change our production system?

No. CSPeach is a development agent: it works in your development system. Changes reach production the way they always have — through the transports and the release process you already run. Three write modes ship, and approval-gated is the default, so by default a developer says yes to each write.

How the write gates work

Does CSPeach do clean core?

Yes. /abap-clean-core recommends the clean-core approach for a requirement or an object and classifies the clean-core level A, B, C or D, with citable evidence to defend the call. /abap-cloud-check checks ABAP code for unreleased APIs, classic statements, direct access to SAP standard tables and statements not allowed in ABAP Cloud. /abap-cca reads the estate inventory from cspeach team discover and gives judgement: the scope, application areas and retire candidates. It runs no ATC and no SQL, and writes no files.

Does CSPeach know RAP and CDS?

Each skill carries written rules for RAP, CDS and ABAP Cloud — naming, the order objects must be created and activated in, type codes, annotations, draft handling and access control — learned on live S/4HANA systems. /abap-rap builds the whole stack: database table, CDS interface view, CDS projection view, behavior definition, behavior implementation, metadata extension, service definition and service binding. /abap-extend-model changes an existing CDS view or RAP business object in place, and /abap-eml writes and tests the EML.

Does it check released APIs?

Yes, on your own system. /abap-cloud-check reports the unreleased APIs a custom object uses, and /abap-clean-core verifies its classification against the live released-API state and ATC when CSPeach is connected. The upgrade skills look up successor APIs for what has to be replaced.

Does it work on ECC?

Yes. CSPeach runs against ECC EHP7 and above, on-premise S/4HANA, and S/4HANA Cloud Private Edition. The clean-core work starts on the system you have today.

How does this sit beside Joule for Developers?

They do different jobs. CSPeach does the clean-core work described on this page, on ECC, on-premise S/4HANA and S/4HANA Cloud Private Edition. The side-by-side page sets out what each one is for.

CSPeach with SAP Joule for Developers

Start with the free toolkit.