agentic-abap-evals
Six ABAP navigation tasks for a coding agent, each with needles and anti-needles that grade only the final answer, and a Node grader that applies them whatever agent stack produced the reply.
Six natural-language tasks an ABAP developer might hand to an agent: walk two inheritance chains to the ancestor they share, find the framework class that dispatches a redefined method, get from an OO repository method to the DDIC table behind it. Each is a JSON spec holding the prompt, the substring needles a correct answer contains, and antiNeedles regexes that fail a run which fabricates line numbers or reference counts. The suite mandates nothing about the agent: you hand it the prompt text, then pass the spec and the reply to grading/grade.mjs, as a command or as an imported grade function. What a spec does constrain is capabilities rather than tool names, so defaults.json forbids localFilesystemAccess, shellExecution, webSearch, subAgents and destinationMutation on every prompt and the runner translates each term into its own denylist, which is what lets one eval run against more than one agent stack. All six prompts target SAP-standard objects, so a system with a standard ABAP stack can answer them; nothing here grades the trajectory and nothing here runs the agent.
Facts
Where it sits
Who is behind it
In the atlas: maintains 1, contributes to 8@albertminkmaintainer
What it declares
Every artifact
- Type
- CLI
- Origin
- Independently maintained
- Runtime
- Node.js
As a CLI
- Distributed through
- does not say
Connections
Checking an AI feature still behaves after a model or prompt change
SAP's application server and development platform for ABAP. For the things here it is the system a developer's editor or an agent's tool reaches over ADT, and a program calls over RFC; where it runs is the deployment's, as for SAP BW/4HANA.
Download
Architecture
Download
cl_aff_*, cl_abap_compiler and if_ci_test, and the source the agent has to read lives there rather than on the runner's disk.README
quoted from albertmink/agentic-abap-evals under MIT, readagentic-abap-evals
A collection of agentic ABAP benchmarks.
Each eval is a natural-language task an ABAP developer might hand to an agent (find an override, walk a type hierarchy, locate a framework dispatcher) plus a rubric that grades the agent's final answer without inspecting how it got there. Bring any agent stack — MCP server, IDE plugin, custom integration. If it answers the question, it passes.
Today this repo is a curated showcase of what is possible.
The six showcase evals
| id | category | what's hard about it |
|---|---|---|
aff-handler-intermediate-parent | multi-hop | Walk two sibling inheritance chains and identify the intermediate ancestor one passes through. |
aff-handler-no-deserialize | multi-hop | Enumerate handler classes, inspect each override, find the one that diverges from the base. |
atc-check-call-order | multi-hop | The redefinition is not the call site. Find the framework class that actually dispatches the method. |
db-table-from-exists-method | multi-hop | Bridge OO repo → DDIC. Resists training-data hallucinations like TADIR/TRDIR. |
longest-method-large | multi-hop | Find the longest public method in a class large enough that whole-file reads should not be cheaper. |
nonexistent-class | negative-path | Restraint test. The agent should run one search, see nothing, and stop — no fabrications. |
All six target SAP-standard objects (cl_aff_*, cl_abap_compiler, if_ci_test) so any system with a standard ABAP stack can run them.
How to use them
The flow is intentionally simple — the suite makes no assumptions about your agent stack:
- Pick a prompt. Read the
promptfield from any JSON inprompts/. - Hand the prompt text to your agent. That's it. No tool list, no system message we mandate.
- Grade the agent's final reply. Pass the spec and the answer text to
grading/grade.mjs.
# CLI use
echo "cl_ddls_aff_object_handler" > /tmp/answer.txt
node grading/grade.mjs prompts/aff-handler-no-deserialize.json /tmp/answer.txt
# → PASS (exit code 0)
// Library use, from any Node-based runner
import { grade } from './grading/grade.mjs';
import { readFileSync } from 'node:fs';
const spec = JSON.parse(readFileSync('prompts/aff-handler-no-deserialize.json', 'utf8'));
const answer = await myAgent.run(spec.prompt);
const { pass, reasons } = grade(spec, answer);
Run the grader's own self-tests any time:
node grading/grade.test.mjs
What "tool-agnostic" means
The spec does not tell you which tools your agent should use. We grade outputs only; trajectories are your business.
What the spec does express, where it's relevant, is constraints — capability-level guardrails the runner is expected to enforce. ABAP source lives on the SAP system as virtual files; an agent that falls back to local grep or find is by definition hallucinating. So every prompt forbids localFilesystemAccess, shellExecution, webSearch, subAgents, and destinationMutation by default (see defaults.json). Individual prompts may add prompt-specific forbidden capabilities — nonexistent-class forbids referenceSearch, because the restraint signal we want is "agent decided not to call it."
The capability vocabulary lives in CAPABILITIES.md. Each capability term is mapped to "what this means at runtime" — your runner translates it to its own denylist (e.g. for Claude Code, this becomes --disallowedTools Bash,Read,…).
This split — vendor-neutral capabilities in the spec, vendor-specific tool names in the runner — is what lets the same eval run against different agent stacks without rewrites.
Spec schema
{
"id": "task-id",
"category": "multi-hop | negative-path | coverage",
"description": "What capability or regression this prompt exercises (1–2 sentences).",
"prompt": "The natural-language task handed to the agent.",
"success": {
"type": "substring_any | substring_all",
"needles": ["..."],
"caseInsensitive": true
},
"antiNeedles": ["regex pattern that, if matched, fails the run"],
"constraints": {
"forbiddenCapabilities": ["referenceSearch"]
},
"notes": "Free-form: ground-truth date, gotchas, ideal trajectory hints."
}
prompt and success are the only required fields. See PROMPT_QUALITY.md for the rubric-design rules every spec follows.
Why grade only the answer (and not the trajectory)?
Trajectory grading — "did the agent call the right tool?" — only makes sense when you know the tool taxonomy. As soon as the suite leaves any one stack, that vocabulary breaks.
Output grading is portable, lossy, and honest. It misses cases where the agent guessed correctly without doing real work; it cannot reward elegant trajectories over clumsy ones. We accept that. The compensation is antiNeedles (catches lying patterns: fabricated line numbers, "Found N references" on non-existent classes) and prompts that are hard enough that guessing usually fails.
When trajectory-aware metrics matter to you, build them in your runner. Keep the spec portable.
Roadmap
This is a v1 deliberately scoped to a curated showcase. Things we will add when there is reason to:
- More prompts. PRs welcome — see
CONTRIBUTING.md. - Optional capability tags on prompts (
hover,referenceSearch,typeHierarchy) once we have enough evals to make tagging useful for filtering. - A reference runner harness, once two or more agent stacks have informally validated the suite.
- Aggregated benchmark dashboards, once the contributor base wants them.
Contributing
We want your evals. Read PROMPT_QUALITY.md resp. CONTRIBUTING.md and open a PR.
License
MIT — see LICENSE.
Others providing
Compare all 5 on the Agent evals page →- capire/skillscapire/skillsSAP's own skill set for coding agents working on CAP — cap-developer, cap-add-remote-service, cap-upgrade and cap-trivia, each a SKILL.md with references beside it.sap official, capAgent skills for CAP development, each a SKILL.md with referencesfrom CAP
- DanKromp/skillOverflowDanKromp/skillOverflowA collection of 41 agent skills, 37 for CAP, Fiori, BTP, UI5, ABAP, Integration Suite and HANA work and four for creating, reviewing and retiring skills, each with its own eval.independent, capCollection of 41 agent skills, 37 for SAP development tasksfrom CAP
- LLM-Benchmark-ABAP-Code-GenerationLLM-Benchmark-ABAP-Code-GenerationA benchmark that has a model write ABAP for 180 tasks ten times each, then feeds the SAP system's own syntax check, activation and ABAP Unit results back for up to five correction rounds.independent, abapBenchmark of LLM ABAP code generation against a real SAP systemfrom ABAP
- @saptarishi/cds-plugin-llm@saptarishi/cds-plugin-llmA CAP service kind that puts eleven model providers behind one chat, stream, embed and batch interface, so which backend a service calls is a profile in package.json rather than a change to the handler.independent, capCAP service kind putting eleven model providers behind one APIfrom CAP
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
History in the atlas
- First seen.
For your agent
- Ref
artifact:albertmink-agentic-abap-evals- JSON
- /artifacts/albertmink-agentic-abap-evals.json
- MCP
- Connecting an agent