Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add marcellourbani/vscode_abap_remote_fs --skill abap-code-review-helpergit clone --depth 1 https://github.com/marcellourbani/vscode_abap_remote_fsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/marcellourbani/vscode_abap_remote_fs/abap-code-review-helper)<a href="https://agentmods.dev/skills/marcellourbani/vscode_abap_remote_fs/abap-code-review-helper"><img src="https://agentmods.dev/badge/skills/marcellourbani/vscode_abap_remote_fs/abap-code-review-helper/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/marcellourbani/vscode_abap_remote_fs/abap-code-review-helper"><img src="https://agentmods.dev/badge/skills/marcellourbani/vscode_abap_remote_fs/abap-code-review-helper.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00142 | $0.08616 |
| Opus 5.5 | $0.00057 | $0.03446 |
| Sonnet 5.5 | $0.00028 | $0.01723 |
| Haiku 4.5 | $0.00014 | $0.00862 |
Grade A, and why
abap-code-review-helper scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 27d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 301 lines — stays where its author put it; the contents beside it link to each section on GitHub.
ABAP Coding Pitfalls
These requirements describe what the code must do. For reviews, report violations; for authorized changes, make the code meet the applicable requirements. Report important unknowns, not passed-check lists unless asked. Never claim checks or tests that were not performed.
Review safeguards
- A finding must describe a reachable failure in the current code. A hypothetical future change is not a current defect.
- Existing protections must be traced before reporting a missing check. An enclosing branch, earlier exit, full assignment, or earlier compatible sort can already satisfy the requirement.
- A safe equivalent must be accepted. The code need not use the reviewer's preferred syntax.
- A claim disproved during investigation must be removed from the findings and severity totals.
- Quoted code, types, keys, and signatures must match inspected source. Missing information must remain unknown.
- Security findings require an actual input/control path to a security-sensitive operation. Dynamic ABAP conditions are not automatically SQL injection.
- Correctness defects, conditional risks, measured performance problems, and maintainability suggestions must be kept separate.
Examples of mistakes that pass syntax checks
These are examples, not the complete list. The later requirements also apply wherever relevant to the code.
- Old data must not be used after a failed read. After
READ TABLE ... INTOorSELECT SINGLE,sy-subrcmust be checked or saved before another operation can overwrite it. The result must be checked before the target is used. If no row was found, the target work area must not be used as a successful result: it may still hold data from the previous read. The return code must determine whether a row was found, not whether the work area is initial; a real row can contain blank or zero values. - Temporary loop variables must be cleared or fully assigned before use on each iteration. A skipped assignment must not leave the previous row's value in use. Running totals and other values needed across iterations must not be cleared prematurely. Clearing is unnecessary when the value is always replaced completely before use.
- Internal-table inserts and updates must use the statement that matches the intended action.
INSERT ... INTO TABLEadds a row.MODIFY TABLEchanges an existing row found by the primary table key; it must not be used to insert a missing row.MODIFY ... INDEXchanges the row at that index.- Duplicate handling must match the actual statement and table keys. A duplicate can set a failure return code, raise an exception, or cause a dump.
sy-subrcmust be checked when the statement sets it; exceptions must be handled where required. This also applies to bulk inserts, constructors, and unique secondary keys. INSERTmust not be replaced withMODIFYjust to hide duplicates. The business rule must determine whether a duplicate is rejected, skipped, merged, or updated.
- Database
INSERT,UPDATE, andMODIFYmust match the allowed create/change behavior.INSERTis for create-only andUPDATEfor change-only. DatabaseMODIFYmust be used only when insert-or-update by primary key is intended. Unlike internal-tableMODIFY TABLE, it can insert a missing row.- Duplicate primary keys and conflicts with unique secondary indexes must be handled. Depending on the statement, these can return a failure code, raise an exception, or cause a dump.
MODIFYcan still fail on a unique secondary index. - A duplicate must not be ignored unless the business rule allows it. A preceding existence check is not enough: another session can insert the row before this session does.
- The table must be sorted correctly before
BINARY SEARCH. On a standard table, the search fields must be the leading sort fields, in ascending order and in the same sequence as the search key. A descending sort orAS TEXTsort is not a substitute. Appends or changes must not break that order before the search. A suitable declared sorted or hashed key is preferable when it removes the need to maintain this order manually. - An index-based parallel cursor must have the correct sort, start index, and exit check.
- The tables must be ordered by the grouping fields as required by the algorithm. The first matching inner row's
sy-tabixmust be saved before another operation can overwrite it, and the inner loop must startFROMthat saved index. - The inner loop must exit when any grouping field differs (
NE/<>). Comparing only part of a composite group key or continuing into the next group is incorrect. - Duplicate keys in both tables must be handled. An inner group must remain available to any later outer row that also needs it. The last successful index must not be reused after a failed search.
- The tables must be ordered by the grouping fields as required by the algorithm. The first matching inner row's
- The FAE table must be checked for empty before the SELECT.
SELECT ... FOR ALL ENTRIES IN @lt_keysmust be guarded byIF lt_keys IS NOT INITIALor an earlier return/skip when it is empty. With an empty FAE table, the entire explicitWHEREcondition can be ignored, not just conditions usinglt_keys. The query can then read every row allowed by implicit restrictions such as the current client. A skipped SELECT must not leave its previous result in use accidentally. - An empty range in WHERE field IN @range_table means no restriction on that field." If empty input should return no rows, the SELECT must be skipped or an empty result returned explicitly.
- The number of keys passed through
IN rangemust stay within the database's limits.- A large range in
WHERE field IN @lt_rangecan exceed SQL statement-size or parameter limits and cause a database error or dump. - Large exact-key lists must use an approach suitable for the expected volume, such as FAE with a nonempty-table check, a supported join, or smaller key batches. Neither FAE nor a hardcoded batch size is safe at every size on every system.
- The selection must keep its intended meaning. FAE removes duplicate result rows. Exclusions, intervals, and patterns must not be replaced blindly with equality checks or split into separate queries whose results are combined.
- A large range in
SELECT SINGLEmust not choose the latest or preferred row from several matches. It is suitable when the key is unique or any matching row is acceptable, including an existence check. Selecting the first, latest, or top-N rows must useORDER BYwith an extra sort field when needed to resolve ties. Database result order must not be relied on withoutORDER BY.- Database reads inside loops must be avoided unless their number and cost are justified. This includes SELECTs inside methods and function modules called by the loop. Reading needed rows together and looking them up by table key is preferable. Per-row reads may be appropriate for a justified buffered lookup or another bounded access pattern.
- SELECTs must retrieve only needed columns by default.
SELECT *must not be the default: extra columns increase transfer and memory use. Whole-row reads are acceptable when the complete row is needed and the expected row count and row size are acceptable. - A field symbol must be assigned before it is used. When assignment can fail or be skipped, access must be guarded by
IF <row> IS ASSIGNEDor an equivalent successful-assignment check. The unassigned case must skip, return, or raise an error before dereferencing; otherwise the code can dump withGETWA_NOT_ASSIGNED. Inside a successfulLOOP ... ASSIGNING, another check is unnecessary unless later code unassigns the symbol or invalidates its row. - The result of dynamic
ASSIGNmust be checked before the field symbol is used.sy-subrcmust be checked or saved before another operation can overwrite it. A failed assignment can leave the field symbol pointing at an older object.IS ASSIGNEDalone does not establish that the new assignment worked. When an old assignment must not survive, the symbol must be unassigned before the attempt. Failure must be handled before the symbol is used. - Missing rows in table expressions must be handled.
itab[ ... ]can raiseCX_SY_ITAB_LINE_NOT_FOUND. Where absence is expected, that exception must be handled or an appropriate default used. A missing mandatory row must produce an error rather than silently becoming a blank value. Unrelated errors must not be hidden by a broad catch. - A helper, exit, or BAdI must not commit the caller's work without permission from the calling application.
COMMIT WORKcan save unrelated pending changes made by the caller. It is allowed only where the application or framework explicitly permits that routine to end the transaction. - Database changes must be protected against conflicting changes by other sessions. Between reading a row and acting on it, another session can change it. The code must use the appropriate lock, a single conditional database operation, or a version/value check that rejects a conflicting update. An existence check alone does not make concurrent creation safe.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 27d ago Changed · +32 tokens per session 16bc58f76056
- 1mo ago First seen · 301 lines · 110 tokens per session scan A e98a733b3e04
abap-code-review-helper is a skill published in the GitHub repository marcellourbani/vscode_abap_remote_fs (399 stars, last pushed 4d ago), licensed MIT. It adds 142 tokens to every session and 8,616 once invoked, about $0.0006 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-15.
Other skills, from other repositories
code-review
Review pull requests for repository fit, meaningful value, trustworthy provenance, differentiation, and maintainability in awesome-copilot.
code-changes
Workflow for any task that ends in code changes: issue analysis or triage, pull request review comments, features, bug fixes, refactors. Invoke at the start of such a task, before reading or writing code.
sap-transport-gate
Use for SAP Transport Request pre-release gate review (QAS/PRD). Triggers on any TR number in input (pattern: uppercase letters + K + 6 digits, e.g., DEVK900123, ECDK943668). Asks user: code-quality-only or functional+code review. Performs 10-dimension risk review of ABAP/CDS/DDIC source, object list, dependencies…
abap-code-review
Performs structured pre-release security and quality review of SAP ABAP programs across 9 dimensions (SEC, AUTH, DATA, PERF, STD, INTERFACE, CHANGE, COMP, FUNC), producing a formal sign-off-ready Markdown assessment report. Trigger when the user asks to review, audit, assess, or check ABAP code before release …
atc-cloudification
Configure ATC clean core and Cloud Readiness checks using the SAP Cloudification Repository, and map ATC findings to clean core levels (A, B, C, D). Use when users ask about ATC check variants for cloud readiness, clean core compliance, clean core levels, released/classic/internal/noAPI object classification…
abap
Comprehensive ABAP code quality checking using abaplint (automated static analysis) and Clean ABAP principles (manual code review). Use when users ask to check, lint, validate, review, or analyze ABAP code for syntax errors, clean code compliance, code quality, best practices, or adherence to Clean ABAP guidelines.…